锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include "SYSMETS.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("SysMets2");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;//榪欑紿楀彛綾誨埆鏍峰紡鍛婅瘔windows錛屽鏋滄按騫蟲垨鑰呭瀭鐩村ぇ灝忓彂鐢熸敼鍙橈紝鍒欏己鍒舵洿鏂版樉紺哄尯鍩熴?/span>
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("Thi program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName,
TEXT("Get System Metrics No. 2"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM IParam)
{
static int cxChar, cxCaps, cyChar, cyClient, iVscrollPos;
HDC hdc;
int i, y;
PAINTSTRUCT ps;
TCHAR szBuffer[10];
TEXTMETRIC tm;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - 1, FALSE);//璁劇疆婊氬姩鏉¤鏁?/span>
SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);//璁劇疆婊氬姩鏉$殑鍏跺疄浣嶇疆
return 0;
case WM_SIZE:
/*
褰撶獥鍙eぇ灝忔敼鍙樻椂錛寃indows緇欑獥鍙f秷鎭鐞嗙▼搴忓彂閫佷簡涓涓猈M_SIZE娑堟伅銆俉M_SIZE娑堟伅蹇呯劧璺熺潃涓涓猈M_PAINT娑堟伅銆傚洜涓哄畾涔夌獥鍙g被鍒殑鏃跺?br> 鎸囧畾紿楀彛綾誨埆鐨勬牱寮忥細(xì)CS_HREDRAW | CS_VERDRAW
紿楀彛娑堟伅澶勭悊紼嬪簭鐨凩Param鍙傛暟鐨勪綆瀛楃粍涓寘鍚樉紺哄尯鍩熺殑瀹藉害錛岄珮瀛楃粍涓寘鍚樉紺哄尯鍩熺殑楂樺害
case WM_SIZE:
cxClient = LOWORD(IParam);
cyClient = HIWORD(IParam);
return 0;
LOWORD鍜孒IWORD瀹忓湪Windows琛ㄥご鏂囦歡WINDEF.H涓?nbsp;瀹氫箟銆傝繖浜涘畯鐨勫畾涔夌湅璧鋒潵鍍忚繖鏍鳳細(xì)
#define LOWORD(I)((WORD)(I))
#define HIWORD(I)((WORD)(((DWORD)(I) >> 16 & 0xFFFF))
*/
cyClient = HIWORD(IParam);
return 0;
case WM_VSCROLL:
/*windows瀵規(guī)粴鍔ㄦ潯鐨勫鐞嗭細(xì)
澶勭悊鎵鏈夋粴鍔ㄦ潯榧犳爣浜嬩歡
褰撲嬌鐢ㄨ呭湪婊氬姩鏉″唴鍗曞嚮榧犳爣鏃訛紝鎻愪緵涓縐嶃屽弽鐩告樉紺恒嶇殑闂儊
褰撲嬌鐢ㄨ呭湪婊氬姩鏉″唴鎷栧姩鍗峰姩鏂瑰潡鏃訛紝縐誨姩鍗峰姩鏂瑰潡
涓哄寘鍚粴鍔ㄦ潯紿楀彛鐨勭獥鍙f秷鎭鐞嗙▼搴忓彂閫佹粴鍔ㄦ秷鎭?br> */
/*
鍜屾墍鏈夌殑娑堟伅涓鏍鳳紝W(xué)M_VSCROLL 鍜學(xué)M_HSCROLL涔熷甫鏈墂Param鍜孖Param娑堟伅娣″嚭錛屽浜庢潵鑷綔涓虹獥鍙g殑涓閮ㄥ垎棰濆緩绔嬬殑婊氬姩鏉℃秷鎭?br> 鍙互蹇界暐IParam錛屽畠鍙敤浜庝綔涓哄瓙紿楀彛鑰屽緩绔嬬殑婊氬姩鏉★紙閫氬父鍦ㄥ璇濇鍐咃級
wParam浣庡瓧緇勬寚鍑洪紶鏍囧婊氬姩鏉¤繘琛岀殑鎿嶄綔銆傝繖涓暟鍊艱鐪嬫垚涓涓氱煡鐮侊紝浠B寮澶翠唬琛╯croll bar鐨勬爣蹇楃銆傚湪WINUSER.H涓畾涔?br> #define SB_LINEUP 0
#define SB_LINELEFT 0
#define SB_LINEDOWN 1
#define SB_LINERIGHT 1
#define SB_PAGEUP 2
#define SB_PAGELEFT 2
#define SB_PAGEDOWN 3
#define SB_PAGERIGHT 3
#define SB_THUMBPOSITION 4
#define SB_THUMBTRACK 5
#define SB_TOP 6
#define SB_LEFT 6
#define SB_BOTTOM 7
#define SB_RIGHT 7
#define SB_ENDSCROLL 8
*/
switch(LOWORD(wParam))
{
case SB_LINEUP:
iVscrollPos -= 1;
break;
case SB_LINEDOWN:
iVscrollPos += 1;
break;
case SB_PAGEUP:
iVscrollPos -= cyClient / cyChar;
break;
case SB_PAGEDOWN:
iVscrollPos += cyClient / cyChar;
break;
case SB_THUMBPOSITION:
iVscrollPos = HIWORD(wParam);
break;
default:
break;
}
iVscrollPos = max (0, min(iVscrollPos, NUMLINES - 1));
if (iVscrollPos != GetScrollPos(hwnd, SB_VERT))//GetScrollPos鑾峰彇鍏堝墠婊氬姩鏉$殑浣嶇疆
{
SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);//閲嶈婊氬姩鏉′綅緗?/span>
InvalidateRect(hwnd, NULL, TRUE);//浣挎暣涓獥鍙f棤鏁堬紝InvalidateRect鍛煎彨浜х敓涓涓猈M_PAINT娑堟伅錛?/span>
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for (i = 0; i < NUMLINES; i++)
{
y = cyChar * (i - iVscrollPos);
TextOut(hdc, 0, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
TextOut(hdc, 22 * cxCaps, y, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));
SetTextAlign(hdc, TA_RIGHT | TA_TOP);
TextOut(hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
wsprintf(szBuffer, TEXT("%5d"),
GetSystemMetrics (sysmetrics[i].Index)));
SetTextAlign(hdc, TA_LEFT | TA_TOP);
}
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, IParam);
}
]]>
]]>
#pragma comment( lib,"winmm.lib")//澧炲姞閾炬帴搴撴枃浠訛紝PlaySound鍑芥暟瑕佷嬌鐢╳inmm.lib閾炬帴搴?/span>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdline, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("HelloWin");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
//瀹氫箟渚濇嵁榪欎釜綾誨埆鏉ュ緩绔嬬殑鎵鏈夌獥鍙f墍浣跨敤鐨勭獥鍙f秷鎭鐞嗙▼搴忕殑鍦板潃鈥斺擶ndProc 鍑芥暟,
//C璇█涓?鍍忚繖鏍峰湪緇撴瀯涓嬌鐢ㄥ嚱鏁板悕,鎻愪緵鐨勬槸鎸囧悜鍑芥暟鐨勬寚閽?/span>
wndclass.lpfnWndProc = WndProc;
//榪欎袱涓瓧孌電敤浜庡湪紿楀彛綾誨埆緇撴瀯鍜寃indows鍐呴儴淇濆瓨鐨勭獥鍙g粨鏋勪腑棰勭暀涓浜涢澶栫┖闂?br> //0琛ㄧず涓嶄嬌鐢?/span>
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;//絎?绔犳湁浠嬬粛
//紼嬪簭鐨勬墽琛屽疄浣撳彞鏌?WinMain鐨勫弬鏁頒箣涓)
wndclass.hInstance = hInstance;
//LoadIcon鍔犺澆鍥炬爣鍙ユ焺銆?br> //1:NULL琛ㄧず灝嗗浘鏍囪涓洪鍏堝畾涔夌殑鍥炬爣,
//濡傛灉鎯沖姞杞借嚜瀹氫箟鐨勫浘鏍囨椂璇ュ弬鏁拌璁懼畾涓虹▼搴忕殑鎵ц瀹炰綋鍙ユ焺hInstance(鍥炬爣搴旇瀛樻斁鍦ㄧ鐩樹笂鐨?EXE紼嬪簭鏂囦歡涓級
//2:鍥劇ず
//瀵逛簬棰勫厛瀹氫箟鍥炬爣錛屾鍙傛暟浠DI寮濮嬬殑鏍囧織絎?ID浠h〃鍥炬爣鍙ユ焺),鏍囪瘑絎﹀湪WINUSER.H涓畾涔?/span>
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//紿楀彛宸︿笂绔皬鍥炬爣,IDI_APPLICATION鍥炬爣鏄竴涓畝鍗曠殑紿楀彛灝忓浘褰?/span>
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//榧犳爣鍥炬爣
//鎸囧畾渚濇嵁榪欎釜綾誨埆寤虹珛鐨勭獥鍙h儗鏅鑹?windows鏍囧噯鐨勫嚑涓敾鍒蜂篃鎴愪負(fù)澶囩敤(stock)鐢誨埛
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//鍙栧緱鍥懼艦瀵硅薄,榪欓噷鍙栧緱鐧借壊鐢誨埛
//鎸囧畾紿楀彛綾誨埆鑿滃崟,NULL琛ㄧず娌℃湁搴旂敤紼嬪簭鑿滃崟
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;//紿楀彛綾誨埆鍚嶇О
if (!RegisterClass(&wndclass))//娉ㄥ唽紿楀彛綾誨埆,RegisterClass灝嗚幏寰椾竴涓寚鍚慦INCLASS緇撴瀯鐨勬寚閽?/span>
{
MessageBox(NULL, TEXT("this program requires windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
//寤虹珛紿楀彛
hwnd = CreateWindow(szAppName, //紿楀彛綾誨瀷鍚嶅瓧
TEXT("The Hello Program"),//紿楀彛鏍囬
WS_OVERLAPPEDWINDOW,//windows椋庢牸
CW_USEDEFAULT,// 鍒濆鍖杧
CW_USEDEFAULT,//鍒濆鍖杫
CW_USEDEFAULT,//鍒濆鍖杧鏂瑰悜灝哄
CW_USEDEFAULT,// 鍒濆鍖杫鏂瑰悜灝哄
NULL,//鐖剁獥鍙e彞鏌?閫氬父濡傛灉紿楀彛涔嬮棿瀛樺湪鐖跺瓙鍏崇郴錛屽瓙紿楀彛浼?xì)鍑虹幇鍦ㄧ埗绐楀彛涓婇?/span>
NULL,//紿楀彛鑿滃崟鍙ユ焺
hInstance,//紼嬪簭鎵ц瀹炰綋鍙ユ焺
NULL//寤虹珛鍙傛暟,鐢ㄨ繖涓弬鏁板瓨鍙栫▼搴忎腑鍙兘寮曠敤鍒扮殑鏁版嵁
);
/*
鍦–reateWindow鍛煎彨浼犲洖涔嬪悗錛學(xué)indows鍐呴儴宸茬粡寤虹珛浜嗚繖涓獥鍙c傝繖灝辨槸璇達(dá)紝W(xué)indows宸茬粡閰嶇疆浜嗕竴鍧楀唴瀛橈紝
鐢ㄦ潵淇濆瓨鍦–reateWindow鍛煎彨涓寚瀹氱獥鍙g殑鍏ㄩ儴淇℃伅璺熶竴浜涘叾瀹冧俊鎭紝鑰學(xué)indows紼嶅悗灝辨槸渚濇嵁紿楀彛鍙ユ焺鎵懼埌榪欎簺淇℃伅鐨勩?br> */
/*鏄劇ず紿楀彛
1:紿楀彛鍙ユ焺
2:浣滀負(fù)鍙傛暟浼犵粰WinMain鐨刬CmdShow,瀹冪‘瀹氭渶鍒濆湪灞忓箷涓婃樉紺虹獥鍙g殑澶у皬
(涓鑸ぇ灝廠W_SHOWNORMAL銆佹渶灝忓寲SW_SHOWMINIMIZED榪樻槸鏈澶у寲SW_SHOWMAXIMIZED)
SW_SHOWMINNOACTIVE琛ㄧず紿楀彛鍙樉紺哄湪宸ヤ綔鍒楄〃涓?br> */
ShowWindow(hwnd, SW_SHOWMINNOACTIVE);
UpdateWindow(hwnd);
//浠庢秷鎭槦鍒椾腑鑾峰彇娑堟伅
while (GetMessage(&msg, NULL, 0, 0))
{
/*
msg鐨勫瀷鎬佹槸MSG緇撴瀯,鍦╓INUSER.H涓畾涔夊涓?br> typedef struct tagMSG
{
HWND hwnd ; // 鎺ユ敹娑堟伅鐨勭獥鍙e彞鏌勶紝鍦℉ELLOWIN紼嬪簭涓紝榪欎竴鍙傛暟涓嶤reateWindow浼犲洖鐨刪wnd鍊肩浉鍚岋紝鍥犱負(fù) 榪欐槸璇ョ▼搴忔嫢鏈夌殑鍞竴紿楀彛銆?br> //娑堟伅鏍囪瘑絎?榪欐槸涓涓暟鍊鹼紝鐢ㄤ互鏍囪瘑娑堟伅銆傚浜庢瘡涓秷鎭紝鍧囨湁涓涓搴旂殑鏍囪瘑絎︼紝榪欎簺鏍囪瘑絎﹀畾涔変簬Windows琛ㄥご鏂囦歡
錛堝叾涓ぇ澶氭暟鍦╓INUSER.H涓級錛屼互鍓嶇紑WM錛堛寃indow message銆嶏紝紿楀彛娑堟伅錛夊紑澶淬?br> UINT message ;
WPARAM wParam ; //涓涓?2浣嶇殑銆宮essage parameter錛堟秷鎭弬鏁幫級銆嶏紝鍏跺惈涔夊拰鏁板兼牴鎹秷鎭殑涓嶅悓鑰屼笉鍚?br> LPARAM lParam ; // 涓涓?2浣嶇殑娑堟伅鍙傛暟錛屽叾鍊間笌娑堟伅鏈夊叧銆?br> DWORD time ; // 娑堟伅鏀懼叆娑堟伅闃熷垪涓殑鏃墮棿銆?br> POINT pt ; //娑堟伅鏀懼叆娑堟伅闃熷垪鏃剁殑榧犳爣鍧愭爣銆侾OINT鍦╓INDEF.H涓畾涔夊涓媡ypedef struct tagPOINT{ LONG x, y; }POINT, *PPOINT;
}
*/
TranslateMessage(&msg);//杞瘧鏌愪簺閿洏娑堟伅,璇︾湅絎叚绔?/span>
DispatchMessage(&msg);//灝嗘秷鎭彂閫佺粰紿楀彛娑堟伅澶勭悊紼嬪簭WndProc
}
return msg.wParam;
}
/* 紿楀彛娑堟伅澶勭悊紼嬪簭
紿楀彛娑堟伅澶勭悊紼嬪簭鐨勫洓涓弬鏁頒笌MSG緇撴瀯鐨勫墠鍥涗釜瀛楁鏄浉鍚岀殑
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM IParam)
{
/*
鍥涗釜鍙傛暟涓嶮SG緇撴瀯鍓嶅洓涓瓧孌電浉鍚?br> hwnd:鎺ュ彈娑堟伅鐨勭獥鍙o紝涓嶤reateWindows鍑芥暟榪斿洖鍊肩浉鍚?br> message:鏍囧織娑堟伅鐨勬暟鍊?br> wParam,lParam:32浣嶇殑娑堟伅鍙傛暟錛屾彁渚涙洿澶氱殑娑堟伅淇℃伅
*/
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
//澶勭悊WM_CREATE娑堟伅騫跺皢鎺у埗浼犲洖緇橶indows,windows浠嶤reateWindows鍛煎彨涓紶鍥炲埌HELLOWIN涓?/span>
case WM_CREATE:
//1:澹伴煶鐨勬枃浠跺悕縐?/span>
PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
return 0;
case WM_PAINT:
//瀵筗M_PAINT鐨勫鐞嗗嚑涔庢繪槸浠嶣eginPaint寮濮嬶紝浠ヤ竴涓狤ndPaint緇撴潫
//榪欎袱涓嚱鏁扮殑絎竴涓弬鏁版槸紼嬪簭鐨勭獥鍙e彞鏌勶紝絎簩涓槸鎸囧悜PAINTSTRUCT鐨勭粨鏋勬寚閽?br> //璇ョ粨鏋勫寘鍚竴浜涚獥鍙f秷鎭鐞嗙▼搴忥紝鍙互鐢ㄦ潵鏇存柊鏄劇ず鍖哄煙鐨勫唴瀹?/span>
hdc = BeginPaint(hwnd, &ps);//緇樺埗紿楀彛,浣跨敤娉ㄥ唽紿楀彛綾誨埆鐨刉NDCLASS緇撴瀯鐨刪brBackground瀛楁涓寚瀹氱殑鐢誨埛鏉ュ埛鑳屾櫙銆備紶鍥炶澶囧唴瀹?鍗蟲樉紺哄櫒鍙婂叾璁懼椹卞姩)鍙ユ焺
GetClientRect(hwnd, &rect);//rect鎸囧悜涓涓猂ECT鍨嬫佺殑recgtangle緇撴瀯,RECT鏈塴eft,top, right, bottom鍥涗釜瀛楁(鍍忕礌鐐規(guī)暟)
/*DrawText鐢ㄤ簬杈撳嚭鏂囧瓧,
1:浠嶣eginPaint(浼犲洖鐨勮澶囧唴瀹瑰彞鏌?
2:瑕佽緭鍑虹殑鏂囧瓧
3:-1琛ㄧず瀛楃涓叉槸浠?涓虹粨灝劇殑銆?br> 4:涓緋誨垪浣嶆棗鏍?鍙傛暟鍊艱Hello,windows鏄劇ず鍦ㄦ樉紺哄尯鍩熶腑澶?br> 鏄劇ず鍖哄煙鏈夋敼鍙樻椂錛寃ndProc浼?xì)鎺ュ彈鏂扮殑WM_PAINT娑堟伅,
閫氳繃鍛煎彨GetClient鍘葷殑鍙樺寲鍚庣殑紿楀彛澶у皬錛屽湪鏂扮獥鍙d腑鏄劇ず鏂囧瓧銆?br> */
DrawText(hdc, TEXT("Hello, window!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);//閲婃斁璁懼鍐呭鍙ユ焺錛屼嬌涔嬩笉鍐嶆湁鏁?/span>
return 0;
case WM_DESTROY:
//鐢ㄤ簬紿楀彛鐨勫叧闂?PostQuitMessage鍦ㄦ秷鎭槦鍒椾腑鎻掑叆WM_QUIT娑堟伅,璇ユ秷鎭殑鍊間負(fù)0
//GetMessage瀵逛簬姣忎釜闄や簡WM_QUIT涔嬪鐨勪粠娑堟伅闃熷垪涓彇鍑虹殑鎵鏈夋秷鎭兘浼犲洖闈?鍊?br> //璇ュ嚱鏁版帴鏀禬M_QUIT鍚庡鑷碬inMain閫鍑烘秷鎭▼搴忓驚鐜紝緇堟紼嬪簭鍚庢墽琛宺eturn msg.wParam,wParam鏄紶閫?br> //緇橮ostQuitMessage鍑芥暟鐨勫鹼紝榪欓噷涓?銆?/span>
PostQuitMessage(0);
return 0;
}
//鎵ц鍐呭畾鐨勬秷鎭鐞?灝嗙獥鍙f秷鎭鐞嗙▼搴忎笉澶勭悊鐨勬秷鎭紶緇欒繖涓獁indows鍑芥暟錛屽惁鍒欎竴鑸姩浣滐紝濡傜粓姝㈢▼搴忓皢涓嶄細(xì)姝e父鎵ц
return DefWindowProc(hwnd, message, wParam, IParam);
}
]]>