以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- Windows 程序内部运行机制 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=87922) |
-- 作者:葛靖青001 -- 发布时间:11/24/2010 3:32:00 PM -- Windows 程序内部运行机制 【转自互联网】 一、WinMain 函数原型 int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance 程序当前运行实例句柄 HINSTANCE hPrevInstance, // handle to previous instance 前一个实例句柄,参数总为NULL LPSTR lpCmdLine, // command line 以空字符串结尾的命令行参数 int nCmdShow // show state 指定窗口的显示方式 ) 二、创建一个窗口 1.设计一个窗口类 2.注册一个窗口类 3.创建窗口 4.显示及更新窗口 (1).设计一个窗口类 typedef struct _WNDCLASS{ UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON Icon; HCURSOR Cursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; } WNDCLASS; ① style 属性指定窗口样式: CS_HREDRAW - 水平宽度变化重绘。 CS_VREDRAW - 垂直方向高度变化重绘. CS_NOCLOSE - 禁用系统CLOSE命令.设关闭按钮. CS_DBLCLKS - 窗口接收双击消息. ② lpfnwndproc 函数指针 指向窗口过程函数 窗口过程函数是一个回调函数 ③ cbclsExtra; -- 一般值为0 Windows 系统中每一个窗口类型管理一个WNDCLASS结构 ④ cbwndExtra; -- 一般值为0 Windows系统中为每一个窗口管理一个内部数据结构,在注册一个窗口类时, 应用程序能够指定一定字节数的附加内存空间,称为窗口附加内存. ⑤hInstance 包含窗口过程的程序实例句柄 ⑥hIcon 窗口类图标句柄 成员变量须为一个图标资源句柄且成员为NULL,为系统提供默认图标 我们可使用loadIcon函数来加载一个图标资源,并且它给系统分配图标句柄. 函数原型: HIcon loadIcon(HINSTANCE hInstance, LPCTSTR lpIconName) ⑦hCursor指定窗口类光标句柄 -- 必须加载一个光标资源句柄,如果成员为NULL, 无论何时鼠标进入到应用程序窗口中,应用程序都必须明确设置光标形状。 ⑧hbrBackgound指定窗口类背景画刷句柄 当窗口发生重绘,系统使用这里指定画刷来擦除窗口背影. ⑨ lpszMenuName -- 指定菜单资源名字(以以后终止字符串) 如果使用菜单资源ID,那么需要用MAKENTRESouRCE宏来转换 如果将其初始化为NULL,那么就算默认没有菜单。 ⑩ lpszClassName - 指定窗口类名字(相当于给窗口取名字) 设计宏窗口类后(WNDCLASS),我们还需要用 RegisterClass函数 对其进行注册,注册成功后,才可创建该类型窗口 原型如下: ATOM RisterClass(Const WNDCLASS *LPWNDCLass); 函数只有 - 参数,即上步骤中所设计窗口类对象指针。 四、创建窗口 -- CreateWindow 函数 HWND CreateWindow( LPCTSTR lpClassName, // 窗口类的名称 说明1 LPCTSTR lpWindowName // 窗口的名字 - 窗口样式又标题栏,指定窗口名是在标题栏 DWORD dwstyle, // 指定窗口类样式,具体参考WS_OVERLAPPEDWINDOW类型 int x, // 窗口左上角x.y坐标 -- 宽、高。 -- x,设为CW_USEDEFAULT,窗口默认左上角坐标忽略y参数。 int y, int nWidth, int nHeight, // - 设为 CW_USEDEFAULT 窗口默认宽、高,nHight忽略。 HWND hwndparent, // 创建窗口的父窗口句柄 HMENU hmenu. // 指定窗口菜单句柄 HANDLE hInstance, // 指定窗口所属应用程序实例句柄 LPVOID lparam // WM_CREATE消息附加参数lparam传入数据指针 // 创建多文档界面窗口,lparam指向CLIENTCREATESRUCT结构体多数窗口设为NULL // 说明1、调用CreateWindows函数前,没有用RegisterClass函数,注册名称的窗口类。 #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED // 产生层叠窗口有标题栏和边框 WS_CAPTION |\ 创建一个有标题窗口 WS_SYSMENU |\ 创建在标题栏上有系统菜单和WS_CAPTION类型一起作用 WS_THICKFRAME |\ 创建一个具有可调边框窗口 WS_MINIMIZEBOX |\ 最小化窗口,设定WS_SYSMENU类型 WS_MAXIMIZEBOX |\ 最大化窗口,设定WS_SYSMENU类型 ) 窗口创建成功,CreaeWindow 函数返回系统为窗口分配句柄,否则返回NULL 五、显示及更新窗口 -- ShowWindow 函数 原型 Bool ShowWindow( HWND hwnd, // 创建窗口后返回哪个窗口句柄。 int nCmdshow // 用来指定窗口显示状态。 ); nCmdShow 参数一般为: SW_HIDE -- 隐藏并激活其他窗口 SW_SHOW --窗口原位置 以原来尺寸激活和显示窗口 SW_SHOWMAXIMIZED -- 激活窗口并将其最大化显示 SW_SHOWMINIMIZED -- 激活窗口并将其最小化显示 SW_SHOWNORMAL -- 激活并显示窗口 -- 窗口最小化或最大化状态 系统其恢复原来尺寸和大小。 更新窗口 -- updateWindow来刷新窗口 原型 Bool updateWindow( HWHD hwndl;// 指创建成功后的窗口句柄 ) updateWindow 函数通过发送一个WM_PAINT 消息来刷新窗口 updateWindow 将WM_PAINT消息直接发送给窗口过程函数进行处理,而没放到我们前面所说的消息队列中。 六、消息循环 -- GetMessage函数 原型: Bool Getmessage( LPMSG lpmsg, // 指向一个消息结构体 -- 将消息队列中信息保存在结构体对象中。 HWND hwnd, // 接收属于哪个窗口消息,通常设置NULL接收属于调用线程所有窗口的窗口消息 UINT WMsgFiltermin, // 获取消息最小值,设为0接收所有消息。 UINT WMsgFiltermax // 获取消息最大值,设为0接收所有消息。 ); 函数直接返回-1 MSG msg; while (GetMessage(&msg,null,0,0)) { Translatemessage(&msg); // 用于将虚拟键消息转换为字符消息 Dispatchmessage(&msg); // 分配一个消息到窗口过程,窗口过程函数对消息进行处理 } 七、编写窗口过程函 LRESULT CALLBACK WinSunProc( HWND hwnd, // 窗口句柄 UINT uMsg, // 消息代码 WPARAM wParam, // 第一条消息参数 LPARAM lParam // 第二条消息参数 ); { switch(uMsg) { case WM_CHAR: // 用户按下字符键时...收到WM_CHAR消息通过Translatemessage函数转换ASCII值。 char szChar[20]; sprintf(szChar,"char code is %d",wParam); MessageBox(hwnd,szChar,"char",0); break; case WM_LBUTTONDOWN: // 接收窗口按下鼠标左键 会产生 WM_LBUTTONDOWN 消息. MessageBox(hwnd,"mouse clicked","message",0); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,50,"程序员之家",strlen("程序员之家")); //ReleaseDC(hwnd,hdc); break; case WM_PAINT: // 对 WM_PAINT 消息进行处理。当窗口客户区部分或全部无效时,系统发生 WM_PAINT 消息 // 通知应用程序重新绘制窗口。 HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,&ps); TextOut(hDC,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org")); EndPaint(hwnd,&ps); break; case WM_CLOSE: // 用户点击关闭按钮时 系统会接收 WM_CLOSE if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO)) { DestroyWindow(hwnd); // 当用户在对话框上选择 是时~~会调用DestroyWindow销毁窗口。 } break; case WM_DESTROY: // 要想让程序正常退出,必须响应 WM_DESTROY 消息~~并在消息代码中调用 PostQuitMessage 函数 PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); // 函数调用默认的窗口过程,对程序没有处理的其他消息提供默认处理。 } |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
4,109.375ms |