Windows程序

时间:2025-03-22 12:35:37

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

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

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;
}