第一次写技术博客,看完C++ Primer Plus,认识不足,没能把自己的所获所感写出来,想想,其实,现在对于我这个刚学的菜鸟来说,也不晚。
买的书没到,看了《深入学习c++》前两章,照书中动手敲了一个Windows程序。
#include <windows.h> //(1)
#include <stdio.h>
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
) //(2)
{
//“设计一个窗口”
WNDCLASS wndcls; //WNDCLASS结构体,定义窗口特征(有以下十个参数)
wndcls.cbClsExtra=0; //一般设为0
wndcls.cbWndExtra=0; //一般设为0
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //窗口类的背景画刷句柄
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); //窗口类的光标句柄
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); //窗口类的图标句柄
wndcls.hInstance=hInstance; //指定包含窗口过程的程序的实例句柄
wndcls.lpfnWndProc=WinSunProc; //函数指针,指向窗口过程函数
wndcls.lpszClassName="sunxin2006"; //窗口类的名字
wndcls.lpszMenuName=NULL; //指定菜单资源名字
wndcls.style=CS_HREDRAW | CS_VREDRAW; //(3)
RegisterClass(&wndcls); //注册窗口类
//“创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄”
HWND hwnd;
hwnd=CreateWindow("sunxin2006","http://www.sunxin.org",
WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); //(4)
//“显示及刷新窗口”
ShowWindow(hwnd,SW_SHOWNORMAL); //(5)
UpdateWindow(hwnd); //调用UpdateWindows来刷新窗口
//“定义消息结构体,开始消息循环”
MSG msg;
while(GetMessage(&msg,NULL,0,0)) //(6)
{
TranslateMessage(&msg); //将虚拟键消息转换为字符消息
DispatchMessage(&msg); //将消息回传给操作系统
}
return msg.wParam;
}
//“编写窗口过程函数”
LRESULT CALLBACK WinSunProc(
HWND hwnd, //窗口句柄
UINT uMsg, //消息代码
WPARAM wParam, //消息代码附加参数
LPARAM lParam //消息代码附加参数
)
{
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); //不能响应VM_PALNT消息时调用
TextOut(hdc,0,50,"程序员之家",strlen("程序员之家"));
//ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps); //BeginPaint 只能在响应WM_PAINT消息时调用
TextOut(hDC,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org"));
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;
}
解析:
(1)http://baike.baidu.com/view/1586331.htm?fr=aladdin
(2)Windows程序的入口点函数,与DOS程序的入口点函数main的作用相同。WinMain函数接收4个参数:
hInstance表示该程序当前运行实例的句柄。那么,什么是句柄呢?句柄就是Windows程序中资源的标识号,这些资源主要是窗口、图标、光标等,简单来说就是这些资源的标记符,例如,窗口是通过窗口句柄(HWND)来标识的。hInstance是一个数值,运行实例后分配得到的值就是通过该参数传递给WinMain函数的。
hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,该参数总是NILL。
lpCmdLine指定传递给应用程序的命令行参数。他是一个一空终止的字符串。
nCmdShow指定程序的窗口应如何显示。
(3)指定窗口的样式。常用的样式有:
CS_HREDRAW功能~当窗口水平方向的宽度发生变化时,将重新绘制整个窗口。
CS_VREDRAW功能~当窗口垂直方向的高度发生变化时,将重新绘制整个窗口。
CS_NOCLOSE功能~禁用系统菜单的Close命令,这将导致窗口没有关闭按钮。
CS_DBLCLKS当用户在窗口中双击鼠标时,向窗口过程发送鼠标双击信息。
(4)创建窗口函数。