您的当前位置:首页正文

VC++详解

2023-12-06 来源:客趣旅游网
Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。没个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。

客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。

系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。

因此,建立窗口后,将进入一个循环。

在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。 循环退出后,程序即结束。 #include \"stdafx.h\" #include //一、消息处理函数

//参数:窗口句柄,消息,消息参数,消息参数

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

//处理感兴趣的消息 switch (message) {

case WM_DESTROY:

//当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环 PostQuitMessage (0) ; return 0 ; }

//其他消息交给由系统提供的缺省处理函数

return ::DefWindowProc (hwnd, message, wParam, lParam) ; }

//二、应用程序主函数

//参数:实例句柄、前一个实例的句柄、命令行参数、窗口显示方式

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {

//1.注册窗口类

static TCHAR szAppName[] = TEXT (\"HelloWin\") ;//窗口类名称 //定制\"窗口类\"结构

WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ;//关联消息处理函数 wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;//实例句柄

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//图标

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;//光标

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);//画刷 wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName = szAppName;//类名称 //注册

if (!RegisterClass (&wndclass)) {

MessageBox (NULL, TEXT (\"RegisterClass Fail!\"), szAppName, MB_ICONERROR) ; return 0 ; }

//建立窗口 HWND hwnd ;

hwnd = CreateWindow (szAppName,//窗口类名称 TEXT (\"The Hello Program\"),//窗口标题 WS_OVERLAPPEDWINDOW,//窗口风格 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,

hInstance,//实例句柄 NULL);

ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ;

//消息循环

MSG msg ;

while (GetMessage (&msg, NULL, 0, 0))//从消息队列中取消息 {

TranslateMessage (&msg) ;//转换消息 DispatchMessage (&msg) ;//派发消息 return msg.wParam ; } }

LRESULT

LRESULT是一个数据类型,

MSDN: 32-bit value returned from a window procedure or callback function

指的是从窗口程序或者回调函数返回的32位值 在winnt.h中typedef long LONG;

在windef.h中typedef LONG LRESULT; 所以LRESULT就是long,也就是长整形 之所以取名类LRESULT,L=>long

result表示结果,说明这个函数的返回值是某个结果。

WNDCLASS 的 cbClsExtra 和 cbWndExtra 有什么用啊?

应该是分别规定类的额外需要保存的空间的大小值,就好像你设计了一个窗口类,然后定义了一个窗口类的基本特征以后,你还需要将你这个类进行某种个性化,比如说你想用一个BOOL标记这种类的对象窗口是否带背景音乐功能,你cbClsExtra的大小应该设置为sizeof(bool),然后你的窗口,也可以指定其有一个保留内存大小,比如说你想通过一个字符串来指定背景音乐的路径,这时你的cbWndExtra的值可以设置为一定大小,你的音乐字符串大小不能超过此值。

你看SIZEOF()这个值当然应该是相同的了,这个SIZEOF的结果是cbWndExtra与cbClsExtra的数据类型的大小

GetStockObject

函数功能:该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。 函数原型:HGDIOBJ GetStockObject(int fnObject); 参数:

fnObject:指定对象的类型,该参数可取如下值之一;

BLACK_BRUSH:黑色画笔;DKGRAY_BRUSH:暗灰色画笔;DC_BRUSH:在Windows98,Windows NT 5.0和以后版本中为纯颜色画笔,缺省色为白色,可以用SetDCBrushColor函数改变颜色,更多的信息参见以下的注释部分。GRAY_BRUSH:灰色画笔;HOLLOW_BRUSH:空画笔(相当于HOLLOW_BRUSH);

LTGRAY_BRUSH:亮灰色画笔;NULL_BRUSH:空画笔(相当于HOLLOW_BRUSH);

WHITE_BRUSH:白色画笔;BLACK_PEN:黑色钢笔;

DC_PEN:在Windows98、Windows NT 5.0和以后版本中为纯色钢笔,缺省色为白色,使用SetDCPenColor函数可以改变色彩,更多的信息,参见下面的注释部分。

WHITE_PEN:白色钢笔;ANSI_FIXED_FONT:在Windows中为固定间距(等宽)系统字体;

ANSI_VAR_FONT:在Windows中为变间距(比例间距)系统字体; DEVICE_DEFAUCT_FONT:在WindowsNT中为设备相关字体; DEFAULT_GUI_FONT:用户界面对象缺省字体,如菜单和对话框;

OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)字体; SYSTEM_FONT:系统字体,在缺省情况下,系统使用系统字体绘制菜单,对话框控制和文本;

SYSTEM_FIXED_FONT:固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本;

DEFAULT_PALETTE:缺省调色板,该调色板由系统调色板中的静态色彩组成。 返回值:如果成功,返回值标识申请的逻辑对象,如果失败,返回值为NULL。

因篇幅问题不能全部显示,请点此查看更多更全内容