6.2 击键消息

当按下一个键时,Windows把WM_KEYDOWN或者WM_SYSKEYDOWN消息放入有输入焦点的窗口的消息队列;当您释放一个键时,Windows把WM_KEYUP或者WM_SYSKEYUP消息放入消息队列中。

 

键按下

键释放

非系统键

WM_KEYDOWN

WM_KEYUP

系统键

WM_SYSKEYDOWN

WM_SYSKEYUP

通常「down(按下)」和「up(放开)」消息是成对出现的。不过,如果您按住一个键使得自动重复功能生效,那么当该键最后被释放时,Windows会给窗口消息处理程序发送一系列WM_KEYDOWN(或者WM_SYSKEYDOWN)消息和一个WM_KEYUP(或者WM_SYSKEYUP)消息。像所有放入队列的消息一样,按键消息也有时间信息。通过呼叫GetMessageTime,您可以获得按下或者释放键的相对时间。

6.2.1 系统键击和非系统键击

一般来说和ALT组合的都是系统键击,其它的都是非系统键击。

#include <Windows.h>
#include <iostream> using namespace std; 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(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR); return ;
} hwnd = CreateWindow(
szAppName,
TEXT("Hk_Mayfly"),
WS_OVERLAPPEDWINDOW,
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) { switch (message) {
case WM_SYSKEYDOWN:
MessageBox(hwnd, TEXT("系统键击按下!"), TEXT("test!"), NULL);
return ;
case WM_KEYDOWN:
MessageBox(hwnd, TEXT("非系统键击按下!"), TEXT("test!"), NULL);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

6.2.2 虚拟键代码

扫描码(通码)和断码的相关信息可以在https://www.cnblogs.com/Mayfly-nymph/p/11228966.html 找到说明。

前四个虚拟键码中有三个指的是鼠标键:

十进制

十六进制

WINUSER.H标识符

必需?

IBM兼容键盘

1

01

VK_LBUTTON

 

鼠标左键

2

02

VK_RBUTTON

 

鼠标右键

3

03

VK_CANCEL

ˇ

Ctrl-Break

4

04

VK_MBUTTON

 

鼠标中键

我们不能在击键消息中检测到鼠标消息。

虚拟键代码

Symbolic Constant Name Hexadecimal Value Mouse Or Keyboard Equivalent
VK_LBUTTON 01 Left mouse button
VK_RBUTTON 02 Right mouse button
VK_CANCEL 03 Control-break processing
VK_MBUTTON 04 Middle mouse button (three-button mouse)
VK_XBUTTON1 05 Windows 2000: X1 mouse button
VK_XBUTTON2 06 Windows 2000: X2 mouse button
— 07 Undefined
VK_BACK 08 BACKSPACE key
VK_TAB 09 TAB key
— 0A–0B Reserved
VK_CLEAR 0C CLEAR key
VK_RETURN 0D ENTER key
— 0E–0F Undefined
VK_SHIFT 10 SHIFT key
VK_CONTROL 11 CTRL key
VK_MENU 12 ALT key
VK_PAUSE 13 PAUSE key
VK_CAPITAL 14 CAPS LOCK key
VK_KANA 15 IME Kana mode
VK_HANGUEL 15 IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
VK_HANGUL 15 IME Hangul mode
— 16 Undefined
VK_JUNJA 17 IME Junja mode
VK_FINAL 18 IME final mode
VK_HANJA 19 IME Hanja mode
VK_KANJI 19 IME Kanji mode
— 1A Undefined
VK_ESCAPE 1B ESC key
VK_CONVERT 1C IME convert
VK_NONCONVERT 1D IME nonconvert
VK_ACCEPT 1E IME accept
VK_MODECHANGE 1F IME mode change request
VK_SPACE 20 SPACEBAR
VK_PRIOR 21 PAGE UP key
VK_NEXT 22 PAGE DOWN key
VK_END 23 END key
VK_HOME 24 HOME key
VK_LEFT 25 LEFT ARROW key
VK_UP 26 UP ARROW key
VK_RIGHT 27 RIGHT ARROW key
VK_DOWN 28 DOWN ARROW key
VK_SELECT 29 SELECT key
VK_PRINT 2A PRINT key
VK_EXECUTE 2B EXECUTE key
VK_SNAPSHOT 2C PRINT SCREEN key
VK_INSERT 2D INS key
VK_DELETE 2E DEL key
VK_HELP 2F HELP key
'0' 30 0 key
'1' 31 1 key
'2' 32 2 key
'3' 33 3 key
'4' 34 4 key
'5' 35 5 key
'6' 36 6 key
'7' 37 7 key
'8' 38 8 key
'9' 39 9 key
— 3A–40 Undefined
'A' 41 A key
'B' 42 B key
'C' 43 C key
'D' 44 D key
'E' 45 E key
'F' 46 F key
'G' 47 G key
'H' 48 H key
'I' 49 I key
'J' 4A J key
'K' 4B K key
'L' 4C L key
'M' 4D M key
'N' 4E N key
'O' 4F O key
'P' 50 P key
'Q' 51 Q key
'R' 52 R key
'S' 53 S key
'T' 54 T key
'U' 55 U key
'V' 56 V key
'W' 57 W key
'X' 58 X key
'Y' 59 Y key
'Z' 5A Z key
VK_LWIN 5B Left Windows key (Microsoft Natural Keyboard)
VK_RWIN 5C Right Windows key (Microsoft Natural Keyboard)
VK_APPS 5D Applications key (Microsoft Natural Keyboard)
— 5E Reserved
VK_SLEEP 5F Computer Sleep key
VK_NUMPAD0 60 Numeric keypad 0 key
VK_NUMPAD1 61 Numeric keypad 1 key
VK_NUMPAD2 62 Numeric keypad 2 key
VK_NUMPAD3 63 Numeric keypad 3 key
VK_NUMPAD4 64 Numeric keypad 4 key
VK_NUMPAD5 65 Numeric keypad 5 key
VK_NUMPAD6 66 Numeric keypad 6 key
VK_NUMPAD7 67 Numeric keypad 7 key
VK_NUMPAD8 68 Numeric keypad 8 key
VK_NUMPAD9 69 Numeric keypad 9 key
VK_MULTIPLY 6A Multiply key
VK_ADD 6B Add key
VK_SEPARATOR 6C Separator key
VK_SUBTRACT 6D Subtract key
VK_DECIMAL 6E Decimal key
VK_DIVIDE 6F Divide key
VK_F1 70 F1 key
VK_F2 71 F2 key
VK_F3 72 F3 key
VK_F4 73 F4 key
VK_F5 74 F5 key
VK_F6 75 F6 key
VK_F7 76 F7 key
VK_F8 77 F8 key
VK_F9 78 F9 key
VK_F10 79 F10 key
VK_F11 7A F11 key
VK_F12 7B F12 key
VK_F13 7C F13 key
VK_F14 7D F14 key
VK_F15 7E F15 key
VK_F16 7F F16 key
VK_F17 80H F17 key
VK_F18 81H F18 key
VK_F19 82H F19 key
VK_F20 83H F20 key
VK_F21 84H F21 key
VK_F22 85H F22 key
VK_F23 86H F23 key
VK_F24 87H F24 key
— 88–8F Unassigned
VK_NUMLOCK 90 NUM LOCK key
VK_SCROLL 91 SCROLL LOCK key
  92–96 OEM specific
— 97–9F Unassigned
VK_LSHIFT A0 Left SHIFT key
VK_RSHIFT A1 Right SHIFT key
VK_LCONTROL A2 Left CONTROL key
VK_RCONTROL A3 Right CONTROL key
VK_LMENU A4 Left MENU key
VK_RMENU A5 Right MENU key
VK_BROWSER_BACK A6 Windows 2000: Browser Back key
VK_BROWSER_FORWARD A7 Windows 2000: Browser Forward key
VK_BROWSER_REFRESH A8 Windows 2000: Browser Refresh key
VK_BROWSER_STOP A9 Windows 2000: Browser Stop key
VK_BROWSER_SEARCH AA Windows 2000: Browser Search key
VK_BROWSER_FAVORITES AB Windows 2000: Browser Favorites key
VK_BROWSER_HOME AC Windows 2000: Browser Launch and Home key
VK_VOLUME_MUTE AD Windows 2000: Volume Mute key
VK_VOLUME_DOWN AE Windows 2000: Volume Down key
VK_VOLUME_UP AF Windows 2000: Volume Up key
VK_MEDIA_NEXT_TRACK B0 Windows 2000: Next Track key
VK_MEDIA_PREV_TRACK B1 Windows 2000: Previous Track key
VK_MEDIA_STOP B2 Windows 2000: Stop Media key
VK_MEDIA_PLAY_PAUSE B3 Windows 2000: Play/Pause Media key
VK_LAUNCH_MAIL B4 Windows 2000: Launch Mail key
VK_LAUNCH_MEDIA_SELECT B5 Windows 2000: Select Media key
VK_LAUNCH_APP1 B6 Windows 2000: Launch Application 1 key
VK_LAUNCH_APP2 B7 Windows 2000: Launch Application 2 key
— B8-B9 Reserved
VK_OEM_1 BA Windows 2000: for the US standard keyboard, the ';:' key
VK_OEM_PLUS BB Windows 2000: for any country/region, the '+' key
VK_OEM_COMMA BC Windows 2000: for any country/region, the ',' key
VK_OEM_MINUS BD Windows 2000: for any country/region, the '-' key
VK_OEM_PERIOD BE Windows 2000: for any country/region, the '.' key
VK_OEM_2 BF Windows 2000: for the US standard keyboard, the '/?' key
VK_OEM_3 C0 Windows 2000: for the US standard keyboard, the '`~' key
— C1–D7 Reserved
— D8–DA Unassigned
VK_OEM_4 DB Windows 2000: for the US standard keyboard, the '[{' key
VK_OEM_5 DC Windows 2000: for the US standard keyboard, the '\|' key
VK_OEM_6 DD Windows 2000: for the US standard keyboard, the ']}' key
VK_OEM_7 DE Windows 2000: for the US standard keyboard, the 'single-quote/double-quote' key
VK_OEM_8 DF  
— E0 Reserved
  E1 OEM specific
VK_OEM_102 E2 Windows 2000: either the '<>' key or the '\|' key on the RT 102-key keyboard
  E3–E4 OEM specific
VK_PROCESSKEY E5 Windows 95, Windows NT 4.0, and Windows 2000: IME PROCESS key
  E6 OEM specific
VK_PACKET E7 Windows 2000: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. The Unicode character is the high word.
— E8 Unassigned
  E9–F5 OEM specific
VK_ATTN F6 Attn key
VK_CRSEL F7 CrSel key
VK_EXSEL F8 ExSel key
VK_EREOF F9 Erase EOF key
VK_PLAY FA Play key
VK_ZOOM FB Zoom key
VK_NONAME FC Reserved for future use
VK_PA1 FD PA1 key
VK_OEM_CLEAR FE Clear key

6.2.4 转移状态

是否按下了位移键(Shift、Ctrl和Alt)或开关键(Caps Lock、Num Lock和Scroll Lock)。通过呼叫GetKeyState函数,您就能获得此信息。例如:

iState = GetKeyState (VK_SHIFT) ;

如果按下了Shift,则iState值为负(即设定了最高位置位)。如果Caps Lock键打开,则从

iState = GetKeyState (VK_CAPITAL) ;

6.3 字符消息

6.3.1 四类字符消息

字符

死字符

非系统字符

WM_CHAR

WM_DEADCHAR

系统字符

WM_SYSCHAR

WM_SYSDEADCHAR

WM_CHAR和WM_DEADCHAR消息是从WM_KEYDOWN得到的;而WM_SYSCHAR和WM_SYSDEADCHAR消息是从WM_SYSKEYDOWN消息得到的(我将简要地讨论一下什么是死字符)。

6.3.2 消息顺序

按键

字符代码

产生方法

ANSI C控制字符

Backspace

0x08

Ctrl-H

\b

Tab

0x09

Ctrl-I

\t

Ctrl-Enter

0x0A

Ctrl-J

\n

Enter

0x0D

Ctrl-M

\r

Esc

0x1B

Ctrl-[

 
#include <Windows.h>
#include <iostream> using namespace std; 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(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR); return ;
} hwnd = CreateWindow(
szAppName,
TEXT("Hk_Mayfly"),
WS_OVERLAPPEDWINDOW,
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) { switch (message) {
case WM_CHAR:
switch (wParam) {
case 'A':
MessageBox(hwnd, TEXT("A键被按下!"), TEXT("TEST!"), NULL);
break;
case 0x61:
MessageBox(hwnd, TEXT("a键被按下!"), TEXT("TEST!"), NULL);
break;
case '\n':
MessageBox(hwnd, TEXT("回车键被按下!"), TEXT("TEST!"), NULL);
break;
case '\r':
MessageBox(hwnd, TEXT("Enter--换行键被按下!"), TEXT("TEST!"), NULL);
break;
} return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

6.3.4 死字符消息

Windows程序经常忽略WM_DEADCHAR和WM_SYSDEADCHAR消息。

定义:在某些非U.S.英语键盘上,有些键用于给字母加上音调。因为它们本身不产生字符,所以称之为「死键」。

工作方式:当使用者按下这个死键时,窗口消息处理程序接收到一个wParam等于音调本身的ASCII或者Unicode代码的WM_DEADCHAR消息。当使用者再按下可以带有此音调的字母键(例如A键)时,窗口消息处理程序会接收到WM_CHAR消息,其中wParam等于带有音调的字母「a」的ANSI代码。

6.5 插入符号(不是光标)

当您往程序中输入文字时,通常有一个底线、竖条或者方框来指示输入的下一个字符将出现在屏幕上的位置。这个标志通常称为「光标」,但是在Windows下写程序,您必须改变这个习惯。在Windows中,它称为「插入符号」。「光标」是指表示鼠标位置的那个位图图像。

键盘操作实例--贪吃球球

整体思路:

  • 在客户区绘制球球和食物
  • 捕获键盘消息,根据键盘操作改变球球的坐标(位置+大小)
  • 当食物与球球接触,食物消息,更新球球大小,随机产生另一个食物
#include <Windows.h>
#include <iostream>
#include <time.h>
#include <tchar.h> #define random(x) (rand()%x) using namespace std; bool Flag = TRUE; 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(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("窗口创建失败!需要Windows NT!(传递消息为UNICODE)"), szAppName, MB_ICONERROR); return ;
} hwnd = CreateWindow(
szAppName,
TEXT("Hk_Mayfly"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
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;
int i = ;
static int cxClient, cyClient, cxFood, cyFood, Count, cyChar;
static POINT apt[];
srand((int)time(NULL));
static HBRUSH hBrush;
TCHAR szBuffer[], szBuffer_A[];
TEXTMETRIC tm; switch (message) {
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cyChar = tm.tmHeight + tm.tmExternalLeading;
hBrush = CreateSolidBrush(RGB(, , ));
ReleaseDC(hwnd, hdc);
return ;
case WM_SIZE:
/*
初始化球球位置为客户区正中心
*/
if (Flag) {
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam); apt[].x = cxClient / - ;
apt[].y = cyClient / - ;
apt[].x = cxClient / + ;
apt[].y = cyClient / + ; Flag = FALSE;
}
/*
食物地址随机
*/
cxFood = random(cxClient);
cyFood = random(cyClient);
return ;
case WM_KEYDOWN:
/*
按键控制球球的移动方向
*/
switch (wParam) {
case VK_UP:
apt[].y -= ;
apt[].y -= ;
break;
case VK_DOWN:
apt[].y += ;
apt[].y += ;
break;
case VK_LEFT:
apt[].x -= ;
apt[].x -= ;
break;
case VK_RIGHT:
apt[].x += ;
apt[].x += ;
break;
case VK_ESCAPE:
wsprintf(szBuffer, TEXT("Congratulation!!! You Get %d"), Count);
MessageBox(hwnd, szBuffer, TEXT("Grade"), 0x4L | 0x40L);
exit();
}
/*
客户区无效化
*/
InvalidateRect(hwnd, NULL, TRUE);
return ;
case WM_PAINT:
/*
判断球球是否吃到食物
*/
if (apt[].x <= cxFood - && apt[].x >= cxFood + && apt[].y <= cyFood - && apt[].y >= cyFood + ) {
/*
生成新的食物,且食物不能在球球内
*/
cxFood = random(cxClient);
cyFood = random(cyClient);
while (apt[].x <= cxFood - && apt[].x >= cxFood + && apt[].y <= cyFood - && apt[].y >= cyFood + ) {
cxFood = random(cxClient);
cyFood = random(cyClient);
}
/*
球球长大了
*/
apt[].x -= ;
apt[].x += ;
apt[].y -= ;
apt[].y += ;
++Count;
}
hdc = BeginPaint(hwnd, &ps);
SelectObject(hdc, GetStockObject(GRAY_BRUSH));
//绘制球球
Ellipse(hdc, apt[].x, apt[].y, apt[].x, apt[].y);
SelectObject(hdc, hBrush);
//绘制食物
Ellipse(hdc, cxFood - , cyFood - , cxFood + , cyFood + ); TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("当前分数:%d"), Count));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向上移动:↑")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向下移动:↓")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向左移动:←")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("向右移动:→")));
TextOut(hdc, cxClient - , + cyChar * i++, szBuffer_A, wsprintf(szBuffer_A, TEXT("退出:ESC")));
EndPaint(hwnd, &ps);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

破解贪吃球球

有兴趣可以看下:点击进入

Windows 程序设计--(六)键盘的更多相关文章

  1. Windows 程序设计 笔记

    知识点 双字节字符集和Unicode字符集有何区别?采用双字节字符集有何问题 双字节字符集(DBCS)编码是0-255,DBCS含有1字节代码与2字节代码,而Unicode是统一的16位系统,这样就允 ...

  2. Windows程序设计学习笔记(1):一个简单的windows程序

    <Windows程序设计>(第五版)(美Charles Petzold著) #include<windows.h> LRESULT CALLBACK WndProc(HWND, ...

  3. Windows 程序设计(4) MFC 03 -系列学习

    本文整体目录和绝大部门内容来自 [鸡啄米网站]的MFC系列文章,欢迎支持原创 (一)VS2010/MFC编程入门之前言 VC++全称是Visual C++,是由微软提供的C++开发工具,它与C++的根 ...

  4. Windows 程序设计

    一.Win32 API /******************************************************************** created: 2014/04/1 ...

  5. 关于《Windows程序设计(第五版)》中一个实例程序的疑问

    最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...

  6. windows 程序设计自学:添加图标资源

    #include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...

  7. windows程序设计笔记

    2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照wind ...

  8. 《Windows程序设计第5版》学习进度备忘

    书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...

  9. MFC Windows程序设计源代码免费下载

    本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...

  10. windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释

    看windows程序第五章GDI编程部分.一直卡壳在这里了. 下面我来说下自己的想法.看是否对您有帮助. 首先我们来看一个图. SetPolyFillMode(ALTERNATE);  // 系统默认 ...

随机推荐

  1. jmeter post请求在终端传参,并且指定请求参数文件

    命令:jmeter -n -t   jmeter_1.jmx   -l   report/report30.jtl    -Jnum=3000 -e -o   webresult/3000result ...

  2. TCP: time wait bucket table overflow

    .TCP: time wait bucket table overflow tcp的连接数超出了服务器设置的连接数 1 2 3 4 5 6 [root@test log]# netstat -antp ...

  3. mybatis返回新增对象的主键

    加这两行就可以返回这个插入对象的自增的主键<insert id="insertSeatPortraitData" parameterType="seatPortra ...

  4. windows 安装 mysql 5.6

    从官方网站下载安装包:mysql-5.6.33-winx64.zip,解压到d:\java,然后将解压后的bin目录加入系统环境变量Path中,进入mysql根目录,编辑my-default.ini, ...

  5. 在idea中把springboot项目打成jar包遇到的问题(没有主清单属性)

    正确的姿势:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...

  6. JAVA学习纲要

    这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring ...

  7. redis测试

    1,安装redis软件 2,引入redis jar包 3,案例 package test; import java.util.List; import redis.clients.jedis.Jedi ...

  8. GIS矢量大数据采集

    1.使用什么工具采集 2.在哪个网站采集 3.采集哪一种数据 >>地理大数据公众号 >>大数据公众号 >>智能数据湖公众号 点.线.面.体 可视化 >> ...

  9. windows下使用Ant编译Android项目

    1. 安装ant,配置环境变量 2. 执行命令: android update project -p 项目路径 例:android update project -p D:\project\UI_de ...

  10. web css

    CSS圆角——透明圆角化背景图片 序言:第一章中我介绍了最基本的纯CSS圆角框的实现原理,并给出Demo,在本章中会对上一个模型作一些新的创新,实现将背景图片透明圆角化.并给出一些漂亮的通用演示效果. ...