#include<windows.h> //win 32 application 需要的头文件
#include<stdio.h>LRESULT CALLBACK WinNewProc( //回调函数,用于处理消息
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{ //第一步、创建一个窗口类
WNDCLASS winClass; //声明一个WNDCLASS类的变量,下面进行对各成员的赋值
winClass.cbClsExtra = 0; //类的扩展风格,没有就设为0
winClass.cbWndExtra = 0; //窗口的扩展风格,没有就设为0
winClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_PEN); //设定画刷的颜色,设置背景色
winClass.hCursor = NULL; //光标的样式
winClass.hIcon = LoadIcon(hInstance,IDI_ERROR); //设置应用程序的图标
winClass.hInstance = hInstance; //实例句柄
winClass.lpfnWndProc = WinNewProc; //回调函数,WinMain函数前有声明,后有定义
winClass.lpszClassName = "first"; //创建的新类的类名
winClass.lpszMenuName = NULL; //无菜单
winClass.style = CS_HREDRAW | CS_VREDRAW; //样式:水平和垂直拉伸
//第二步、注册一个类
RegisterClass(&winClass); //将该WNDCLASS注册
HWND hwnd; //窗口句柄,用于指向创建的窗口
hwnd = CreateWindow("first", //已经创建的类名
"第一个Win32程序", //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口风格,此处包含最小化、最大化、关闭按钮
300,300, //初始化窗口被创建的坐标位置
600,400, //设定窗口创建时的大小
NULL,NULL, //父窗口和菜单句柄,此处无
hInstance,NULL); //实例句柄与空指针LPVOID
ShowWindow(hwnd,SW_SHOWNORMAL); //将创建的窗口显示出来,显示风格是自然风格
UpdateWindow(hwnd); //更新窗口MSG msg; //声明一个消息结构体变量
while(GetMessage(&msg,NULL,0,0)) //消息循环
{
TranslateMessage(&msg); //转换消息,解释翻译消息
DispatchMessage(&msg); //调用回调函数处理消息
}return 0;
}
//全局静态变量,用于记录发生重绘的次数
static int count = 1; //记录WM_PAINT消息的次数LRESULT CALLBACK WinNewProc(
HWND hwnd, // handle to window 窗口句柄
UINT uMsg, // message identifier 消息标识
WPARAM wParam, // first message parameter 消息的第一个附加参数,比如记录用户的按键
LPARAM lParam // second message parameter 消息的第二个附加参数
)
{
switch(uMsg) //选择消息,只处理用户感兴趣的消息
{//当窗口初始显示、最小化、最大化、窗口尺寸发生改变均发送WM_PAINT消息
case WM_PAINT: //重绘消息,当窗口发生尺寸发生改变就需要重绘
HDC hdc; //DC句柄
PAINTSTRUCT ps; //重绘结构体
hdc = BeginPaint(hwnd,&ps); //开始重绘,与EndPaint函数成对使用
char ch[20]; //存储信息的临时缓冲区
sprintf(ch,"这是第%d次重绘",count++); //格式转换函数、包含于stdio.h头文件中
TextOut(hdc,200,200,ch,strlen(ch)); //TextOut函数将该信息在200,200的坐标位置显示出来
EndPaint(hwnd,&ps); //结束重绘
break;
case WM_DESTROY:
PostQuitMessage(0); //当发生WM_DESTROY消息,发出退出消息,退出消息循环,终止程序
break;
case WM_CHAR: //键盘按下消息
char szChar[20];
sprintf(szChar,"您按下的键是%d",wParam);
MessageBox(hwnd,szChar,"提示",0); //提示用户按键的ASCII码
break;
case WM_LBUTTONDOWN: //鼠标左键按下消息
MessageBox(hwnd,"鼠标左键按下","提示",0);
HDC hDc;
hDc = GetDC(hwnd);
TextOut(hDc,0,50,"您按下了鼠标左键",strlen("您按下了鼠标左键"));
ReleaseDC(hwnd,hDc); //与GetDC函数成对出现
break;
case WM_RBUTTONDOWN: //鼠标右键按下消息
HDC hDC;
hDC = GetDC(hwnd);
MessageBox(hwnd,"鼠标右键按下","提示",0);
TextOut(hDC,0,150,"您按下了鼠标右键",strlen("您按下了鼠标右键"));
ReleaseDC(hwnd,hDC);
break;
case WM_CLOSE: //用户按下关闭时弹出确认对话框
if(IDYES==MessageBox(hwnd,"确定退出吗?","提示",MB_YESNO))
{
DestroyWindow(hwnd); //如果用户按下确认,则发出WM_DESTROY消息
}
break;
default : //除此之外的消息,则调用默认的回调函数
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
/*附加
1、窗口与句柄
窗口是是屏幕上一块矩形区域,是Windows应用程序与用户进行交互的接口。窗口分为客户区和非客户区。
在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的,要对某个窗口进行操作,首先就要得到这个窗口的句柄。
其它各种资源(窗口,图标,光标等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。
光标句柄(HCURSOR),图标句柄(HICON),窗口句柄(HWND),画刷句柄(HBRUSH)。
2、消息队列与消息循环
消息队列:每当一个Windows应用程序创建后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序的窗口的消息,
消息产生后被投递到消息队列中,应用程序通过一个消息循环不断的消息队列中取出消息进行响应。
响应过程由系统向应用程序发送消息,实际就是调用应用程序的消息处理函数即回调函数。
当收到PostQuitMessage消息时,退出消息循环
3、创建一个完整的Win32程序,该程序实现创建一个窗口,其中主要步骤为
A.WinMain函数的定义,主函数类似与控制台程序的main函数
B.创建一个完整的窗口的四个步骤
a.设计窗口类;b:注册窗口类;c:创建窗口,声明一个窗口句柄标识创建的窗口册;d:显示窗口,可选择不同的显示风格
C.进行消息循环,调用回调函数对消息进行处理
D.编写窗口过程函数,处理需要的消息,不需要的消息交给DefWindowProc默认的消息处理函数
4、获取DC使用后要释放DC即GetDC()与ReleaseDC()要成对使用,否则会造成内存泄漏
5、在WM_PAINT重回消息中,BeginPaint()要与EndPaint()成对使用,且只用于重绘消息中
*/
01windows程序运行机制、代码编写流程与剖析
最新推荐文章于 2024-07-25 17:24:15 发布