VC++创建一个Windows窗口程序

时间:2022-09-07 23:26:40
本文为《VC++深入详解》第一章的笔记

创建一个完整的Windows窗口程序主要步骤为

  1. WinMain函数的定义
  2. 创建一个窗口
  3. 编写消息循环
  4. 编写窗口过程函数

窗口的创建:

VC++创建一个Windows窗口程序


消息循环:
在创建、显示、更新窗口之后,我们需要编写一个消息循环,不断从消息队列中取出消息,并进行响应。

GetMessage(),Peekmessage()从消息队列中取出消息,并保存在消息结构体中。

TranslateMessage(LPMSG  lpMsg)将虚拟键消息转换为字符消息。它并不会修改原有的消息,只是产生新的消息并投递到消息队列中。

DispatchMessage(LPMSG  lpMsg)分派一个消息到窗口过程,由窗口过程函数对消息进行处理。实际上是将消息回传给操作系统,由操作系统调用窗口过程函数对消息进行处理(响应)。
WIndows的应用程序消息处理机制:

VC++创建一个Windows窗口程序

  1. 操作系统接收到应用程序的窗口消息,将消息投递到应用程序的消息队列中。
  2. 应用程序在消息循环中调用Getmessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。
  3. 应用程序调用Dispatchmessage,将消息回传给操作系统。
  4. 系统利用WNDCLASS结构体的lpfnWndProc的成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。
编写窗口过程函数

剩下的工作就是编写一个窗口过程函数,用于出路发送给窗口的消息。


完整实例FirstWindowApp:
新建空白Win32项目,新建源文件FirstWindowApp.cpp

//FirstWindowApp
#include <windows.h>
#include <stdio.h>

//声明回调函数
LRESULT CALLBACK WinProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

//定义WinMian函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{

//设计一个窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);
wndcls.hIcon=NULL;
//wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinProc;
wndcls.lpszClassName="FirstWindowApp";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);

//创建窗口,并保存成功创建窗口后返回的句柄
HWND hwnd;
hwnd=CreateWindow("FirstWindowApp","FirstWindowApp",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,600,400,NULL,NULL,hInstance,NULL);

//显示及更新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

//定义消息结构体,开始消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}


//定义窗口回调函数
LRESULT CALLBACK WinProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","message",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"Hello Windows",strlen("Hello Windows"));
//ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"FirstWindowApp",strlen("FirstWindowApp"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的退出?","message",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}