概述
本文为《VC++深入详解》第一章的笔记
创建一个完整的Windows窗口程序主要步骤为
- WinMain函数的定义
- 创建一个窗口
- 编写消息循环
- 编写窗口过程函数
窗口的创建:
消息循环:
在创建、显示、更新窗口之后,我们需要编写一个消息循环,不断从消息队列中取出消息,并进行响应。
GetMessage(),Peekmessage()从消息队列中取出消息,并保存在消息结构体中。
TranslateMessage(LPMSG lpMsg)将虚拟键消息转换为字符消息。它并不会修改原有的消息,只是产生新的消息并投递到消息队列中。
DispatchMessage(LPMSG lpMsg)分派一个消息到窗口过程,由窗口过程函数对消息进行处理。实际上是将消息回传给操作系统,由操作系统调用窗口过程函数对消息进行处理(响应)。
WIndows的应用程序消息处理机制:
- 操作系统接收到应用程序的窗口消息,将消息投递到应用程序的消息队列中。
- 应用程序在消息循环中调用Getmessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。
- 应用程序调用Dispatchmessage,将消息回传给操作系统。
- 系统利用WNDCLASS结构体的lpfnWndProc的成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。
剩下的工作就是编写一个窗口过程函数,用于出路发送给窗口的消息。
新建空白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;
}
最后
以上就是香蕉红酒为你收集整理的VC++创建一个Windows窗口程序的全部内容,希望文章能够帮你解决VC++创建一个Windows窗口程序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复