|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//应用程序实例句柄
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("MyWindows"); //创建窗口基于什么类 如:男人女人
HWND hwnd;
MSG msg;
WNDCLASS wndclass;// 这个是 类的基本属性------
wndclass.style=CS_VREDRAW | CS_HREDRAW;
wndclass.lpfnWndProc=WndProc;// ??//告诉操作系统--------
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance; // 应用程序实例句柄
wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);//??图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);// 光标箭头
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);// 画刷
wndclass.lpszMenuName=NULL; // 程序菜单目前没有
wndclass.lpszClassName=szAppName;// 随便命名;//创建窗口基于什么类
// 已添完资料开始注册;
if(!RegisterClass(&wndclass) ) // 注册函数->指针WNDCLASS结构
{
MessageBox(NULL,TEXT("这个程序需要在window NT 才能执行"),
szAppName,MB_ICONERROR|MB_OK);
return 0;
}
//----------------进一步为窗口类 添加属性(窗口实例)-----------窗口创建成功GreateWindow-----------
hwnd=CreateWindow(szAppName,TEXT("福建厦门"),//创建窗口基于什么类
WS_OVERLAPPEDWINDOW,//窗口风格|格式 // 窗口边框 有滚动条的修改地方
CW_USEDEFAULT,//初始x 坐标
CW_USEDEFAULT,// y
CW_USEDEFAULT,//初始x方向尺寸
CW_USEDEFAULT,// Y
NULL, // 父窗口句柄
NULL, // 窗口菜单句柄
hInstance, // 程序实例句柄
NULL); // 创建参数
// 返回值一个新的窗口句柄 在 ----hwnd --就抓hwnd句柄控制他--------------
// 完成后 告诉ShowWindow--展示窗口,在于第一次 调用 WinMain函数 nCmdShow做参数
//在随便调用ShoWindow,必须使用下来显示中一个给定值,而不WinMain函数参数的值
ShowWindow(hwnd,iCmdShow);// 显示
UpdateWindow(hwnd);// 更新窗口
//-----------消息循环--------------------------------------
// 此函数GetMessage有返回值很多看 window 常用消息API文档 小甲鱼。
while(GetMessage(&msg,NULL,0,0))//解释窗口消息句柄MSG这是个结构:把结构里所有的属性
{ //传达给句柄指针&MSG->投放各自消息队列里。
TranslateMessage(&msg);//虚拟键消息转-字符消息-送当前线程消息队列,下次线程调用GetMessage被读出
DispatchMessage(&msg);//分派一个消息给窗口过程(回调函数)该消息从GetMessage获得 Window控制权在改函数交给应用程序
// 带着消息找--操作系统--调用-Wndproc-函数
} // 次函数while(0)=退解释进程。MB_QUIT. 交给操作系统CALLBACK WndProc->回调函数
//DispatchMessage(&msg)带着消息找---操作系统--调用-Wndproc-函数 ------重点
return msg.wParam;
}
// -------以下函数跟 GetMessage 是在循环 等消息---直到接到MB_QUIT消息退出循环----
//消息机制:队列化--非队列化:
//队列化:放到队列消息里,
//非队列化:立即送往窗口过程,绕过系统和线程消息队列 例如:UpdateWindow(hwnd)
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
// PAINTSTRUCT 用来存放绘制窗口需要的信息-参数--当BeginPaint函数调用它时 系统自动填充完成
PAINTSTRUCT ps; //窗口过程对客户区进行绘制的信息参数=一个结构成员rect,设备环境句柄hdc其他先不管
HDC hdc; // 用于绘制设备环境句柄
RECT rect; //指定左上角,右下角坐标确定一个要绘制的矩形范围
//-----------------------------客户区范围-----------------------------------
switch(message)
{
// 只要窗口重绘,盖住,移动就会产生WM_PAINT消息=操作系统就会发送WM_PAINT消息到应用程序消息队列里
case WM_PAINT: //一个PAINTSTRUCT结构中:参数:重新绘制的窗口句柄,指向PAINTSTRUCT结构指针,用于存放绘画信息
//BeginPaint 函数返回一个绘画设备环境句柄****HDC*****
hdc=BeginPaint(hwnd,&ps);//指定窗口进行绘画工作的准备,将绘画有关的信息填充到
//BeginPaint函数(是绘画初始化)->需要重绘窗口句柄,包含PAINTSTRUCT 结构指针,
GetClientRect(hwnd,&rect); //获取绘制好的窗口坐标,句柄,指向一个RECT的指针(客户信息)
// 有了BeginPaint还需要字符串往放--所以有GetClientRect函数:获的客户区位置坐标信息也需要rect结构信息->
// 然后调用 DrawText 函数 来绘制->规范**调整最后一个参数的标志的组合->来定制显示的具体形式-
DrawText(hdc,TEXT("大家好"),// DrawText==打印消息,参数:打印方位风格。需要->获得显示设备环境句柄HDC
//绘图都用通过rect 结构函数来完成,也包含 HDC句柄等等...
-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// 显示一行里面 水平居中 垂直居中
EndPaint(hwnd,&ps); //绘制解释,和释放,返回值始终0,参数:重新绘制窗口句柄,指向PAINSTRUCT结构指针
return 0;
case WM_LBUTTONDOWN:
MessageBox(hwnd,TEXT("我被按了一下!!!^_^"),TEXT("好舒服"),MB_OK);
return 0;
case WM_DESTROY: //响应窗口销毁消息:部署否保存 的提醒 然后调用 PostQuitMessage函数
PostQuitMessage(0);//线程终止请求:这个函数通常相应WM_DESTROY 消息
// 参数:nExitCode (0)此值被用作WM_QUIT 消息的wParam参数 重要
return 0; // 指定应用程序的退出代码 就是--正式工作收尾代码----------------------
}
//出来鼠标消息函数交给 DefWindowPro函数
return DefWindowProc(hwnd,message,wParam,lParam);
// 非客户区的代码交给 DefWindowProc函数消息默认来处理,不然点击关闭按钮->关不掉.
//如何处理-消息默认操作系统是怎么处理-操作系统会根据你点击非客户区的坐标来计算是哪个按钮
//然后来传递 最小化,最大,关闭的消息。否则会以为当做在客户区处理
}
|
评分
-
查看全部评分
|