Windows程序设计--(三)窗口与消息
3.1 窗口的创建
3.1.1 系统结构概述
所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数称为「窗口消息处理程序」。
3.1.2 HELLOWIN
#include <Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//消息函数声明 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)//主函数
{
static TCHAR szAppName[] = TEXT("WNDCLASS NAME");//窗口类名称
HWND hwnd;//句柄
MSG msg;//结构体
WNDCLASS wndclass;//窗口类 //窗口类属性
wndclass.style = CS_HREDRAW | CS_VREDRAW;//样式
wndclass.lpfnWndProc = WndProc;//窗口处理函数
wndclass.cbClsExtra = ;//窗口实例扩展
wndclass.cbWndExtra = ;//窗口类扩展
wndclass.hInstance = hInstance;//窗口实例句柄
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//加载图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//鼠标,移入内容区域变成箭头
wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);//主窗口背景色
wndclass.lpszMenuName = NULL;//窗口菜单
wndclass.lpszClassName = szAppName;//窗口类名 if (!RegisterClass(&wndclass)) {//注册窗口类,如果注册失败弹出窗口
MessageBox(NULL, TEXT("窗口创建失败!程序需要Windows NT!(传递窗口消息为UNICODE)"), szAppName, MB_ICONERROR);//消息窗口 return ;
} hwnd = CreateWindow(szAppName, //Windows类名
TEXT("窗口绘制成功!"), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口风格
CW_USEDEFAULT, //初始化窗口位置的X坐标
CW_USEDEFAULT, //初始化窗口位置的Y坐标
CW_USEDEFAULT, //初始化窗口宽度大小
CW_USEDEFAULT, //初始化窗口长度大小
NULL, //父类窗口句柄
NULL, //窗口菜单句柄
hInstance, //程序实例句柄
NULL); //创建参数
ShowWindow(hwnd, iCmdShow);//显示窗口
UpdateWindow(hwnd);//更新窗口 while (GetMessage(&msg, NULL, , )) {//从消息队列中获取消息
TranslateMessage(&msg);//将虚拟键消息转换为字符消息
DispatchMessage(&msg);//分发到回调函数
}
return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hdc;//设备环境句柄
PAINTSTRUCT ps;//绘制结构
/*
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT
其中left,top赋为0,因此right和bottom表示客户区的宽度和高度(像素)
*/
RECT rect;//矩形结构 switch (message) {//处理得到的消息
case WM_CREATE://窗口创建发来消息
MessageBox(hwnd, TEXT("创建成功,音乐播放"), TEXT("Windows"), MB_OK | MB_ICONINFORMATION);
/*
1.波形文件的名称
2.只有当声音文件是一个资源时才有用,此处NULL表示不使用
3.指定一组选项,表示指定了第一个参数为文件名且该段声音是以异步方式播放
*/
PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
return ;
case WM_PAINT://处理窗口绘制
hdc = BeginPaint(hwnd, &ps);//标明窗口绘制开始,设备环境句柄
GetClientRect(hwnd, &rect);//获取窗口客户区的尺寸
/*
1.为环境句柄
2.为要绘制的文本内容
3.设置为-1,表示文本字符串以0结尾
4.传递rect结构体
5.是一组位标记
*/
DrawText(hdc, TEXT("Hello Hk_Mayfly!"), -, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);//结束窗口绘制
return ;
case WM_LBUTTONDOWN:
MessageBox(hwnd, TEXT("左键按下!"), TEXT("BIU"), MB_OK | MB_ICONINFORMATION);
return ;
case WM_RBUTTONDOWN:
MessageBox(hwnd, TEXT("右键按下!"), TEXT("BIU"), MB_OK | MB_ICONINFORMATION);
return ;
case WM_DESTROY://处理窗口关闭时的消息
MessageBox(hwnd, TEXT("主窗口关闭"), TEXT("Windows"), MB_OK | MB_ICONINFORMATION);//显示一个文本字符串
PostQuitMessage();//将退出消息插入消息队列,程序从消息循环退出,return msg.wParam
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);//执行默认消息处理
}
3.1.3 通盘考虑
Windows API离线查询下载:http://download.microsoft.com/download/1/f/0/1f07c259-7ff2-4902-9205-ad1dfb87ccab/VS2008SP1MSDNENUX1506188.iso
上面调用了
函数名 | 函数描述 |
GetStockObject |
获取一个图形对象 |
LoadIcon |
为程序加载图标 |
LoadCursor |
为程序加载光标 |
RegisterClass |
为程序窗口注册一个窗口类 |
MessageBox |
显示消息对话框 |
CreateWindow |
创建一个窗口 |
ShowWindow |
在屏幕上将窗口显示出来 |
UpdateWindow |
重绘窗口客户区 |
GetMessage |
从消息队列获取消息 |
TranslateMessage |
将虚拟键消息转换为字符消息 |
DispatchMessage |
将消息发送给消息处理函数 |
BeginPaint |
准备对窗口进行绘图 |
GetClientRect |
获取窗口客户区尺寸 |
DrawText |
绘制一个文本字符串 |
EndPaint |
结束对窗口的绘图 |
PostQuitMessage |
向消息队列插入"退出"消息 |
DefWindowProc |
执行系统默认的消息处理 |
CS_HREDRAW |
CS_VREDRAW |
IDI_APPLICATION |
IDC_ARROW |
MB_OK |
MB_ICONERROR |
WS_OVERLAPPEDWINDOW |
CW_USEDEFAULT |
DT_SINGLELINE |
DT_CENTER |
DT_VCENTER |
WM_CREATE |
WM_PAINT |
WM_LBUTTONDOWN |
WM_DESTROY |
这些标识符均为常量,在WINUSER.H头文件中有定义,下面是一些前缀的意义
前缀 |
含义 |
CS_ |
类风格选项 |
CW_ |
创建窗口选项 |
DT_ |
文本绘制选项 |
IDI_ |
图标的ID号 |
IDC_ |
光标的ID号 |
MB_ |
消息框选项 |
WM_ |
窗口消息 |
WS_ |
窗口风格 |
匈牙利标记法
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。
例如,szCmdLine中的sz代表「以0结尾的字符串」。在hInstance和hPrevInstance中的h前缀表示「句柄」;在iCmdShow中的i前缀表示「整数」。WndProc的后两个参数也使用匈牙利表示法。正如我在前面已经解释过的,尽管wParam应该更适当地被命名为uiParam(代表「无正负号整数」),但是因为这两个参数是使用数据型态WPARAM和LPARAM定义的,因此保留它们传统的名字。
3.1.4 窗口类的注册
在为程序建立窗口之前,必须首先呼叫RegisterClass注册一个窗口类别。该函数只需要一个参数,即一个指向型态为WNDCLASS的结构指针。此结构包括两个指向字符串的字段,因此结构在WINUSER.H表头文件中定义了两种不同的方式,第一个是ASCII版的WNDCLASSA
typedef struct tagWNDCLASSA { UINT style ; WNDPROC lpfnWndProc ; int cbClsExtra ; int cbWndExtra ; HINSTANCE hInstance ; HICON hIcon ; HCURSOR hCursor ; HBRUSH hbrBackground ; LPCSTR lpszMenuName ; LPCSTR lpszClassName ; } WNDCLASSA, * PWNDCLASSA, NEAR * NPWNDCLASSA, FAR * LPWNDCLASSA ;
在这里提示一下数据型态和匈牙利表示法:其中的lpfn前缀代表「指向函数的长指标」。(在Win32 API中,长指标和短指标(或者近程指标)没有区别。这只是16位Windows的遗物。)cb前缀代表「字节数」而且通常作为一个常数来表示一个字节的大小。h前缀是一个句柄,而hbr前缀代表「一个画刷的代号」。lpsz前缀代表「指向以0结尾字符串的指针」。
Unicode版的结构定义如下:
typedef struct tagWNDCLASSW { UINT style ; WNDPROC lpfnWndProc ; int cbClsExtra ; int cbWndExtra ; HINSTANCE hInstance ; HICON hIcon ; HCURSOR hCursor ; HBRUSH hbrBackground ; LPCWSTR lpszMenuName ; LPCWSTR lpszClassName ; } WNDCLASSW, * PWNDCLASSW, NEAR * NPWNDCLASSW, FAR * LPWNDCLASSW ;
与前者唯一的区别在于最后两个字段定义为指向宽字符串常数,而不是指向ASCII字符串常数。
在WinMain中定义WNDCLASS类型结构
WNDCLASS wndclass;
对该结构的10个字段进行初始化,并调用RegisterClass
位标记
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
代码中用到的这两个标识符表示,所有依据此类别建立的窗口,每当窗口的水平方向大小(CS_HREDRAW)或者垂直方向大小(CS_VREDRAW)改变之后,窗口要完全重画。
在表头文件WINUSER.H中,已定义了一整组以CS为前缀的标识符:
#define CS_VREDRAW 0x0001 #define CS_HREDRAW 0x0002 #define CS_KEYCVTWINDOW 0x0004 #define CS_DBLCLKS 0x0008 #define CS_OWNDC 0x0020 #define CS_CLASSDC 0x0040 #define CS_PARENTDC 0x0080 #define CS_NOKEYCVT 0x0100 #define CS_NOCLOSE 0x0200 #define CS_SAVEBITS 0x0800 #define CS_BYTEALIGNCLIENT 0x1000 #define CS_BYTEALIGNWINDOW 0x2000 #define CS_GLOBALCLASS 0x4000 #define CS_IME 0x00010000
wndclass.lpfnWndProc = WndProc ;
将窗口消息处理程序设定为WndProc函数(我们自定义的函数)
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
这两个字段用于在窗口类别结构和Windows内部保存的窗口结构中预留一些额外空间
wndclass.hInstance = hInstance ;
程序的执行实体句柄(WinMain参数之一)
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
第一个参数是取得预先定义图示的句柄。第二个参数代表图示。对于预先定义图示,此参数是以IDI开始的标识符(「ID代表图示」),标识符在WINUSER.H中定义。
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
LoadCursor函数加载一个预先定义的鼠标光标(命名为IDC_ARROW),并传回该游标的句柄。该句柄被设定给WNDCLASS结构的hCursor字段。当鼠标光标在依据这个类别建立的窗口的显示区域上出现时,它变成一个小箭头。
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
依据这个类别建立的窗口背景颜色。这里所示的GetStockObject呼叫将传回一个白色画刷的句柄:
wndclass.lpszMenuName = NULL ;
指定窗口类别菜单。HElLOWIN没有应用程序菜单,所以该字段被设定为NULL
wndclass.lpszClassName = szAppName ;
类别名称
if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return ; }
Windows 98不支持Unicode程序
3.1.5 窗口的创建
窗口创建
HWND CreateWindow(
LPCTSTR lpClassName, //窗口类名称
LPCTSTR lpWindowName, //窗口标题
DWORD dwStyle, //窗口样式
int x, //窗口初始x坐标
int y, //窗口初始y坐标
int nWidth, //窗口初始x方向尺寸
int nHeight, //窗口初始y方向尺寸
HWND hWndParent, //父窗口句柄
HMENU hMenu, //窗口菜单句柄
HANDLE hlnstance, //程序实例句柄
LPVOID lpParam //创建参数
);
hwnd = CreateWindow(szAppName, //Windows类名
TEXT("窗口绘制成功!"), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口风格
CW_USEDEFAULT, //初始化窗口位置的X坐标
CW_USEDEFAULT, //初始化窗口位置的Y坐标
CW_USEDEFAULT, //初始化窗口宽度大小
CW_USEDEFAULT, //初始化窗口长度大小
NULL, //父类窗口句柄
NULL, //窗口菜单句柄
hInstance, //程序实例句柄
NULL); //创建参数
关于窗口风格除了WS_OVERLAPPEDWINDOW还有
#define WS_OVERLAPPED 0x00000000L //产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。
#define WS_POPUP 0x80000000L //创建一个弹出式窗口。该风格不能与WS_CHLD风格同时使用。
#define WS_CHILD 0x40000000L //创建一个子窗口。这个风格不能与WS_POPUP风格合用。
#define WS_MINIMIZE 0x20000000L //创建一个初始状态为最小化的窗口。仅与WS_OVERLAPPED风格一起使用。
#define WS_VISIBLE 0x10000000L //创建一个最初可见的窗口。
#define WS_DISABLED 0x08000000L //创建一个初始状态为禁止的窗口。
#define WS_CLIPSIBLINGS 0x04000000L //排除子窗口之间的相对区域。
#define WS_CLIPCHILDREN 0x02000000L //创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。
#define WS_MAXIMIZE 0x01000000L //创建一个初始状态为最大化状态的窗口。
#define WS_CAPTION 0x00C00000L //创建一个有标题框的窗口(包括WS_BODER风格)。
#define WS_BORDER 0x00800000L //创建一个单边框的窗口。
#define WS_DLGFRAME 0x00400000L //创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。
#define WS_VSCROLL 0x00200000L //创建一个有垂直滚动条的窗口。
#define WS_HSCROLL 0x00100000L //创建一个有水平滚动条的窗口。
#define WS_SYSMENU 0x00080000L //创建一个在标题条上带有窗口菜单的窗口,必须同时设定WS_CAPTION风格。
#define WS_THICKFRAME 0x00040000L //创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同。
#define WS_GROUP 0x00020000L //指定一组控制的第一个控制。
#define WS_TABSTOP 0x00010000L //创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。
#define WS_MINIMIZEBOX 0x00020000L //创建一个具有最小化按钮的窗口。
#define WS_MAXIMIZEBOX 0x00010000L //创建一个具有最大化按钮的窗口。
#define WS_TILED WS_OVERLAPPED //产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与WS_OVERLAPPED风格相同。
#define WS_ICONIC WS_MINIMIZE //创建一个初始状态为最小化的窗口。仅与WS_OVERLAPPED风格一起使用。
#define WS_SIZEBOX WS_THICKFRAME //创建一个具有厚边框的窗口,可以通过厚边框来改变窗口大小。
#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW //创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX和WS_MAXIMIZEBOX风格的重叠式窗口。
参数使用CW_USEDEFAULT标识符,指示Windows使用重迭窗口的内定位置。(CW_USEDEFAULT定义为0x80000000)表示使用默认的Windows参数值,也可以使用自定义数值。
3.1.6 窗口的显示
程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息:
while (GetMessage (&msg, NULL, , ))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
msg变量是型态为MSG的结构,型态MSG在WINUSER.H中定义如下:
typedef struct tagMSG
{
HWND hwnd ;
UINT message ;
WPARAM wParam ;
LPARAM lParam ;
DWORD time ;
POINT pt ;
}
MSG, * PMSG ;
POINT数据型态也是一个结构,它在WINDEF.H中定义如下:
typedef struct tagPOINT
{
LONG x ;
LONG y ;
}
POINT, * PPOINT;
消息循环以GetMessage呼叫开始,它从消息队列中取出一个消息:
GetMessage (&msg, NULL, , )
TranslateMessage (&msg) ;
将msg结构传给Windows,进行一些键盘转换。
DispatchMessage (&msg) ;
又将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口消息处理程序,让它进行处理。这也就是说,Windows将呼叫窗口消息处理程序。
3.1.8 窗口过程
窗口消息处理程序总是定义为如下形式:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
注意,窗口消息处理程序的四个参数与MSG结构的前四个字段是相同的。第一个参数hwnd是接收消息的窗口的句柄,它与CreateWindow函数的传回值相同。对于与HELLOWIN相似的程序(只建立一个窗口),这个参数是程序所知道的唯一窗口句柄。如果程序是依据同一窗口类别(同时也是同一窗口消息处理程序)建立多个窗口,则hwnd标识接收消息的特定窗口。
第二个参数与MSG结构中的message字段相同,它是标识消息的数值。最后两个参数都是32位的消息参数,提供关于消息的更多信息。这些参数包含每个消息型态的详细信息。有时消息参数是两个存放在一起的16位值,而有时消息参数又是一个指向字符串或数据结构的指针。
程序通常不直接呼叫窗口消息处理程序,窗口消息处理程序通常由Windows本身呼叫。通过呼叫SendMessage函数,程序能够直接呼叫它自己的窗口消息处理程序。我们将在后面的章节讨论SendMessage函数。
3.1.9 消息处理
使用switch...case来处理
switch (message) {//处理得到的消息
case WM_CREATE://窗口创建发来消息
MessageBox(hwnd, TEXT("创建成功,音乐播放"), TEXT("Windows"), MB_OK | MB_ICONINFORMATION);
PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
return ;
case WM_PAINT://处理窗口绘制
hdc = BeginPaint(hwnd, &ps);//标明窗口绘制开始,设备环境句柄
GetClientRect(hwnd, &rect);//获取窗口客户区的尺寸
DrawText(hdc, TEXT("Hello Hk_Mayfly!"), -, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);//结束窗口绘制
return ;
case WM_LBUTTONDOWN:
MessageBox(hwnd, TEXT("左键按下!"), TEXT("BIU"), MB_OK | MB_ICONINFORMATION);
return ;
case WM_RBUTTONDOWN:
MessageBox(hwnd, TEXT("右键按下!"), TEXT("BIU"), MB_OK | MB_ICONINFORMATION);
return ;
case WM_DESTROY://处理窗口关闭时的消息
MessageBox(hwnd, TEXT("主窗口关闭"), TEXT("Windows"), MB_OK | MB_ICONINFORMATION);//显示一个文本字符串
PostQuitMessage();//将退出消息插入消息队列,程序从消息循环退出,return msg.wParam
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);//执行默认消息处理
3.1.10 声音文件的播放
3.1.11 WM_PAINT消息
当窗口显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个消息通知程序。‘
对WM_PAINT的处理几乎总是从一个BeginPaint呼叫开始:
hdc = BeginPaint (hwnd, &ps) ;
而以一个EndPaint呼叫结束:
EndPaint (hwnd, &ps) ;
在这两个呼叫中,第一个参数都是程序的窗口句柄,第二个参数是指向型态为PAINTSTRUCT的结构指针。
呼叫完BeginPaint之后,WndProc接着呼叫GetClientRect:
GetClientRect (hwnd, &rect) ;
第一个参数是程序窗口的句柄。第二个参数是一个指标,指向一个RECT型态的rectangle结构。该结构有四个LONG字段,分别为left、top、right和bottom。GetClientRect将这四个字段设定为窗口显示区域的尺寸。left和top字段通常设定为0,right和bottom字段设定为显示区域的宽度和高度(像素点数)。
WndProc除了将该RECT结构指针作为DrawText的第四个参数传递外,不再对它做其它处理:
DrawText ( hdc, TEXT ("Hello, Windows 98!"), -, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
DrawText可以输出文字(正如其名字所表明的一样)。由于该函数要输出文字,第一个参数是从BeginPaint传回的设备内容句柄,第二个参数是要输出的文字,第三个参数是 -1,指示字符串是以字节0终结的。DrawText最后一个参数是一系列位旗标
常用的有:
DT_BOTTOM //将正文调整到矩形底部; DT_CENTER //使正文在矩形中水平居中; DT_LEFT //正文左对齐; DT_RIGHT //正文右对齐; DT_TOP //正文顶端对齐; DT_VCENTER //使正文在矩形中垂直居中; DT_WORD_ELLIPSIS //截短不符合矩形的正文,并增加省略号;
3.1.12 WM_DESTROY消息
程序通过呼叫PostQuitMessage以标准方式响应WM_DESTROY消息:
PostQuitMessage () ;
该函数在程序的消息队列中插入一个WM_QUIT消息。前面提到过,GetMessage对于除了WM_QUIT之外的从消息队列中取出的所有消息都传回非0值。而当GetMessage得到一个WM_QUIT消息时,它传回0。这将导致WinMain退出消息循环,并终止程序。然后程序执行下面的叙述:
return msg.wParam ;
结构的wParam字段是传递给PostQuitMessage函数的值(通常是0)。然后return叙述将退出WinMain并终止程
Windows程序设计--(三)窗口与消息的更多相关文章
- windows 程序设计自学:窗口正中显示Hello,World
#include <windows.h> LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window UINT uMsg, // ...
- Windows程序设计(第五版)学习:第三章 窗口与消息
第三章 窗口与消息 1,windows窗口过程:应用程序所创建的每一个窗口都有一个与之关联的窗口过程,用于处理传递给窗口的消息. 2,窗口依据窗口类来创建.窗口类标识了用于处理传递给窗口的消息 ...
- Windows程序设计笔记(二) 关于编写简单窗口程序中的几点疑惑
在编写窗口程序时主要是5个步骤,创建窗口类.注册窗口类.创建窗口.显示窗口.消息环的编写.对于这5个步骤为何要这样写,当初我不是太理解,学习到现在有些问题我基本上已经找到了答案,同时对于Windows ...
- windows程序设计.窗口.
第一个windows窗口 #include <windows.h> /* Displays "Hello, World!" in client area */ LRES ...
- Windows程序设计1(工具、编码、窗口)
一.几个常用小工具: 1. 编译器:CL.EXE 将源文件转变为目标文件(汇编语言). CL.EXE /c xxx.c 或 xx.cpp cl.exe -? 显示cl帮助 cl.exe ...
- Windows程序设计2(消息机制、菜单)
一 .小记; PostQuitMessage(0); 产生WM_QUIT消息给进程队列,且立即返回,同时使得消息循环退出,使得进程终止.(其实它通过PostMessage(hWnd,WM_QUIT,0 ...
- 《windows程序设计》第三章学习心得
第三章是基于对一个windows窗口的学习,来达到对windows程序运行机制的理解. 从语言的角度看消息机制,Windows给程序发消息的本质就是调用"窗口过程"函数. Don' ...
- 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化
眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...
- Windows 程序设计
一.Win32 API /******************************************************************** created: 2014/04/1 ...
随机推荐
- python基础--2 字符串
整型 int python3里,不管数字多大都是int类型 python2里面有长整型long 将整型字符串转换为数字 # a='123' # print(type(a),a) # b=int(a) ...
- 基于celery的任务管理
1.celery基本原理 Celery是一个由python编写的简单.灵活.可靠的用来处理大量信息的分布式系统,同时提供了操作和维护分布式系统所需要的工具,说白了就是一个用来管理分布式队列的工具. C ...
- linux基础知识(三)
添加用户 •useradd -d 家目录 -g 组名 -G 组集合(逗号间隔) -p 密码 -s 用户shell程序 用户名 •useradd -d /usr/local/nginx/ -g ngin ...
- linux环境进程开机自检脚本
Linux下shell脚本监控Tomcat的状态并实现自动启动 最近公司需要在Linux下监控tomcat的服务,一旦tomcat服务存在异常或者宕机,重启tomcat保证服务的正常运行,由于Linu ...
- AMROC可视化
备注 通过修改Filetype来改变输出数据的类型. hdf2tab.sh转换全部数据文件 hdf2tab.sh -m多维数据 <!DOCTYPE html PUBLIC "-//W3 ...
- 一些vue 响应式系统的底层的细节
当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/ ...
- 求能粘贴Word 内容(含图片)的在线编辑器
word图片转存,是指UEditor为了解决用户从word中复制了一篇图文混排的文章粘贴到编辑器之后,word文章中的图片数据无法显示在编辑器中,也无法提交到服务器上的问题而开发的一个操作简便的图片转 ...
- hibernate插入数据测试无异常,但数据库没有数据
解决方法: spring test测试默认会将事务回滚,如果想阻止spring transactional回滚,在test方法上加注解@Rollback(false)即可. Hibernate hql ...
- 20180705-Java基础语法
Java基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条 ...
- 【Java架构:进阶技术】——一篇文章搞掂:JVM调优
Sun官方定义的Java技术体系: Java程序设计语言 各种硬件平台上的Java虚拟机 Class文件格式 Java API类库 来自商业机构和开源社区的第三方Java类库 JDK(Java Dev ...