鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > c语言 > >

竹峰(Z.峰)

来源:互联网 作者:佚名 时间:2013-09-06 08:17
Windows程序 Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。 客户写一个消息处理函数,在窗口建立前,将消息处

Windows程序

     Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。
     客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。
     因此,建立窗口后,将进入一个循环。在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。循环退出后,程序即结束。

下面是一个相应鼠标左键单击事件的小示例:

Code#include <windows.h> void InitApplication(HINSTANCE); BOOL InitInstance(HINSTANCE,int); LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); /******************************************** * WinMain 主程序入口 * ******************************************** * hInstance 面向应用程序的当前句柄 * * hPrevInstance 此时的当前句柄 * * lpCmdLine 命令行的字符串 * * nCmdShow 启动时的显示方式 * ********************************************/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; MessageBox(GetFocus(),"Hello world!","Message",MB_OK); //MessageBox(NULL,"Hello world!","Message",MB_OK); //MessageBox(NULL,lpCmdLine,"CmdLine",0); InitApplication(hInstance); if(InitInstance(hInstance,nCmdShow)) { //return 0; while(GetMessage(&msg,(HWND)NULL,(UINT)NULL,(UINT)NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (msg.wParam); } /************************************ * InitApplication 初始化程序 * ************************************ * hInstance 面对应用的句柄 * ************************************/ void InitApplication(HINSTANCE hInstance) { // 注册窗口类 WNDCLASSEX wc; wc.cbSize=sizeof(wc); wc.style=CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc=(WNDPROC)MainWndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName=NULL; wc.lpszClassName="MainClass"; wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION); if (!RegisterClassEx(&wc)) { MessageBox (NULL, TEXT ("RegisterClass Fail!"), “Message”, MB_ICONERROR) ; } } /******************************** * InitInstance 初始化窗口 * ******************************** * hInstance 面对应用的句柄 * * nCmdShow 启动时的显示方法* ********************************/ BOOL InitInstance(HINSTANCE hInstance,int nCmdShow) { HWND hWnd; hWnd=CreateWindow("MainClass", // 窗口类名称 "Image Processing",// 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口风格 CW_USEDEFAULT, // 窗口位置大小 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // 父視窗的 handle,,若本視窗是父視窗,則設為 NULL NULL, // 選單的 handle hInstance, // 主程式句柄 NULL); // 額外資料的指標,若無額外資料通常都設為 NULL if (hWnd==NULL) return (FALSE); ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); return TRUE; } /**************************** * MainWndProc 信息的处理 * **************************** * hWnd 窗口 * * message 信息 * * wParam 字参数 * * lParam 长参数 * ****************************/ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // 处理感兴趣的消息 switch (message) { // 鼠标左键按下事件 case WM_LBUTTONDOWN: MessageBox(hWnd,"鼠标左键已被按下!","Message",MB_OK); break; // 当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环 case WM_DESTROY: MessageBox(GetFocus(),"Thank you for used!","Message",MB_OK); PostQuitMessage(0); break; // 不感兴趣的消息转交给系统提供的缺省处理函数处理 default: return DefWindowProc(hWnd,message,wParam,lParam); } return 0; }


posted on

网友评论
<