| 導購 | 订阅 | 在线投稿
分享
 
 
 

Windows API-GDI入門基礎知識詳解(3)

來源:互聯網  2008-06-01 02:06:58  評論

格式化輸出假如要使用TextOut函數在Windows應用程序中輸出多行文字,我們就必須先取得字符的寬度和高度,通常我們在窗口消息處理函數中處理WM_CREATE消息的時候調用GetTextMetrics函數來獲取他們,之所以放到WM_CREATE的部分調用,是因爲當系統啓動後,系統字體的大小就不會發生改變,我們只需要調用一次GetTextMetrics就可以了。

具體方法如下:

case WM_CREATE:

hdc = GetDC (hwnd); // 取得設備描述表句柄。

GetTextMetrics (hdc, &tm); // 調用GetTextMetrics函數將獲得的信息保存在緩沖區中。

iLFx = tm.tmAveCharWidth;

// 獲得小寫字符的平均寬度,小寫字母的加權平均值就是字符的平均寬度。

iCFx = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;

// 獲得大寫字符的平均寬度,對于變寬字體而言,大寫字符的平均寬度是iLFx乘以150%,而假如是等寬字體,那麽iCFx就等于iLFx。

iFy = tm.tmHeight + tm.tmExternalLeading; // 字符高度等于字符准線上下最大縱向高度加行距。

ReleaseDC (hwnd, hdc) ; // 釋放設備描述表句柄。

return 0;

大家可能對上面代碼中的,tm.tmPitchAndFamily & 1 ? 3 : 2,這樣的寫法感到迷惑,TEXTMETRICS結構的tmPitchAndFamily屬性是用來判定字體是否爲變寬字體的,假如是等寬字體那麽它的低位就爲0,假如爲變寬字體那麽它的低位就爲1,所以通過位運算我們可以判定是否爲變寬字體,假如是就進行乘以150%的操作。

看到這裏,我們已經了解了TextOut函數輸出所需要的所有知識,下面我們將以一個完整的例子對它進一步的學習。

實例練習

例子目的是要將GetSystemMetrics函數所需要的參數以及這些參數的含義和返回值,以字符串的方式並格式化後循環輸出在屏幕上。

該例程我們分爲兩個文件,一個是用來保存GetSystemMetrics函數所需索引的頭文件,另一個則是程序的主文件,代碼的具體解釋見代碼的注釋部分。

代碼如下:

/* sysmetrics.h 頭文件 */

#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))

strUCt

{

int Index; // 索引

TCHAR* szLabel;// 索引的字符串表示

TCHAR* szDesc;// 索引含義

}

sysmetrics [ ] =

{

SM_CXSCREEN, TEXT("SM_CXSCREEN"), TEXT("Screen width in pixels"),

SM_CYSCREEN, TEXT("SM_CYSCREEN"), TEXT("Screen height in pixels"),

SM_CXVSCROLL, TEXT("SM_CXVSCROLL"), TEXT("Vertical scroll width"),

SM_CYHSCROLL, TEXT("SM_CYHSCROLL"), TEXT("Horizontal scroll height"),

SM_CYCAPTION, TEXT("SM_CYCAPTION"), TEXT("Caption bar height"),

SM_CXBORDER, TEXT("SM_CXBORDER"), TEXT("Window border width"),

SM_CYBORDER, TEXT("SM_CYBORDER"), TEXT("Window border height"),

SM_CXFIXEDFRAME, TEXT("SM_CXFIXEDFRAME"), TEXT("Dialog window frame width"),

SM_CYFIXEDFRAME, TEXT("SM_CYFIXEDFRAME"), TEXT("Dialog window frame height"),

SM_CYVTHUMB, TEXT("SM_CYVTHUMB"), TEXT("Vertical scroll thumb height"),

SM_CXHTHUMB, TEXT("SM_CXHTHUMB"), TEXT("Horizontal scroll thumb width"),

SM_CXICON, TEXT("SM_CXICON"), TEXT("Icon width"),

SM_CYICON, TEXT("SM_CYICON"), TEXT("Icon height"),

SM_CXCURSOR, TEXT("SM_CXCURSOR"), TEXT("Cursor width"),

SM_CYCURSOR, TEXT("SM_CYCURSOR"), TEXT("Cursor height"),

SM_CYMENU, TEXT("SM_CYMENU"), TEXT("Menu bar height"),

SM_CXFULLSCREEN, TEXT("SM_CXFULLSCREEN"), TEXT("Full screen client area width"),

SM_CYFULLSCREEN, TEXT("SM_CYFULLSCREEN"), TEXT("Full screen client area height"),

SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"), TEXT("Kanji window height"),

SM_MOUSEPRESENT, TEXT("SM_MOUSEPRESENT"), TEXT("Mouse present flag"),

SM_CYVSCROLL, TEXT("SM_CYVSCROLL"), TEXT("Vertical scroll arrow height"),

SM_CXHSCROLL, TEXT("SM_CXHSCROLL"), TEXT("Horizontal scroll arrow width"),

SM_DEBUG, TEXT("SM_DEBUG"), TEXT("Debug version flag"),

SM_SWAPBUTTON,TEXT("SM_SWAPBUTTON"), TEXT("Mouse buttons swapped flag"),

SM_CXMIN, TEXT("SM_CXMIN"), TEXT("Minimum window width"),

SM_CYMIN, TEXT("SM_CYMIN"), TEXT("Minimum window height"),

SM_CXSIZE, TEXT("SM_CXSIZE"), TEXT("Min/Max/Close button width"),

SM_CYSIZE, TEXT("SM_CYSIZE"), TEXT("Min/Max/Close button height"),

SM_CXSIZEFRAME, TEXT("SM_CXSIZEFRAME"), TEXT("Window sizing frame width"),

SM_CYSIZEFRAME, TEXT("SM_CYSIZEFRAME"), TEXT("Window sizing frame height"),

SM_CXMINTRACK, TEXT("SM_CXMINTRACK"), TEXT("Minimum window tracking width"),

SM_CYMINTRACK, TEXT("SM_CYMINTRACK"), TEXT("Minimum window tracking height"),

SM_CXDOUBLECLK, TEXT("SM_CXDOUBLECLK"), TEXT("Double click x tolerance"),

SM_CYDOUBLECLK, TEXT("SM_CYDOUBLECLK"), TEXT("Double click y tolerance"),

SM_CXICONSPACING, TEXT("SM_CXICONSPACING"), TEXT("Horizontal icon spacing"),

SM_CYICONSPACING, TEXT("SM_CYICONSPACING"), TEXT("Vertical icon spacing"),

SM_MENUDROPALIGNMENT, TEXT("SM_MENUDROPALIGNMENT"), TEXT("Left or right menu drop"),

SM_PENWINDOWS, TEXT("SM_PENWINDOWS"), TEXT("Pen extensions installed"),

SM_DBCSENABLED, TEXT("SM_DBCSENABLED"), TEXT("Double-Byte Char Set enabled"),

SM_CMOUSEBUTTONS, TEXT("SM_CMOUSEBUTTONS"), TEXT("Number of mouse buttons"),

SM_SECURE, TEXT("SM_SECURE"), TEXT("Security present flag"),

SM_CXEDGE, TEXT("SM_CXEDGE"), TEXT("3-D border width"),

SM_CYEDGE, TEXT("SM_CYEDGE"), TEXT("3-D border height"),

SM_CXMINSPACING, TEXT("SM_CXMINSPACING"), TEXT("Minimized window spacing width"),

SM_CYMINSPACING, TEXT("SM_CYMINSPACING"), TEXT("Minimized window spacing height"),

SM_CXSMICON, TEXT("SM_CXSMICON"), TEXT("Small icon width"),

SM_CYSMICON, TEXT("SM_CYSMICON"), TEXT("Small icon height"),

SM_CYSMCAPTION, TEXT("SM_CYSMCAPTION"), TEXT("Small caption height"),

SM_CXSMSIZE, TEXT("SM_CXSMSIZE"), TEXT("Small caption button width"),

SM_CYSMSIZE, TEXT("SM_CYSMSIZE"), TEXT("Small caption button height"),

SM_CXMENUSIZE, TEXT("SM_CXMENUSIZE"), TEXT("Menu bar button width"),

SM_CYMENUSIZE, TEXT("SM_CYMENUSIZE"), TEXT("Menu bar button height"),

SM_ARRANGE, TEXT("SM_ARRANGE"), TEXT("How minimized windows arranged"),

SM_CXMINIMIZED, TEXT("SM_CXMINIMIZED"), TEXT("Minimized window width"),

SM_CYMINIMIZED, TEXT("SM_CYMINIMIZED"), TEXT("Minimized window height"),

SM_CXMAXTRACK, TEXT("SM_CXMAXTRACK"), TEXT("Maximum draggable width"),

SM_CYMAXTRACK, TEXT("SM_CYMAXTRACK"), TEXT("Maximum draggable height"),

SM_CXMAXIMIZED, TEXT("SM_CXMAXIMIZED"), TEXT("Width of maximized window"),

SM_CYMAXIMIZED, TEXT("SM_CYMAXIMIZED"), TEXT("Height of maximized window"),

SM_NETWORK, TEXT("SM_NETWORK"), TEXT("Network present flag"),

SM_CLEANBOOT, TEXT("SM_CLEANBOOT"), TEXT("How system was booted"),

SM_CXDRAG, TEXT("SM_CXDRAG"), TEXT("Avoid drag x tolerance"),

SM_CYDRAG, TEXT("SM_CYDRAG"), TEXT("Avoid drag y tolerance"),

SM_SHOWSOUNDS, TEXT("SM_SHOWSOUNDS"), TEXT("Present sounds visually"),

SM_CXMENUCHECK, TEXT("SM_CXMENUCHECK"), TEXT("Menu check-mark width"),

SM_CYMENUCHECK, TEXT("SM_CYMENUCHECK"), TEXT("Menu check-mark height"),

SM_SLOWMACHINE, TEXT("SM_SLOWMACHINE"), TEXT("Slow processor flag"),

SM_MIDEASTENABLED, TEXT("SM_MIDEASTENABLED"), TEXT("Hebrew and Arabic enabled flag"),

SM_MOUSEWHEELPRESENT, TEXT("SM_MOUSEWHEELPRESENT"), TEXT("Mouse wheel present flag"),

SM_XVIRTUALSCREEN, TEXT("SM_XVIRTUALSCREEN"), TEXT("Virtual screen x origin"),

SM_YVIRTUALSCREEN, TEXT("SM_YVIRTUALSCREEN"), TEXT("Virtual screen y origin"),

SM_CXVIRTUALSCREEN, TEXT("SM_CXVIRTUALSCREEN"), TEXT("Virtual screen width"),

SM_CYVIRTUALSCREEN, TEXT("SM_CYVIRTUALSCREEN"), TEXT("Virtual screen height"),

SM_CMONITORS, TEXT("SM_CMONITORS"), TEXT("Number of monitors"),

SM_SAMEDISPLAYFORMAT, TEXT("SM_SAMEDISPLAYFORMAT"), TEXT("Same color format flag")

};

/* main.cpp 主文件 */

#include <windows.h>

#include <stdio.h>

#include "system.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

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

static char szAppName[] = TEXT("HelloWin");

// 預先定義一個c風格字符串,稍後用于設置窗口類名稱。

WNDCLASS wndclass; // 定義窗口類對象。

wndclass.style = CS_HREDRAW CS_VREDRAW;

wndclass.lpfnWndProc = WndProc ;

// 指定窗口的處理函數爲WndProc,WndProc將處理windows消息。

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; // 窗口類對象的名稱。

//-----------------------------------------------------------------------------------------

RegisterClass (&wndclass);

//-------------------------- 實例化過程 -------------------------------------------------

HWND hwnd ;

//創建用于保存窗口句柄的對象,窗口句柄是系統識別不同窗口的依據,它只是個代號。

hwnd = CreateWindow(

szAppName, // 窗口類名稱。

"GDI 入門", // 窗口標題。

WS_OVERLAPPEDWINDOWWS_HSCROLLWS_VSCROLL, // 窗口樣式。

CW_USEDEFAULT, // 初始的窗口x軸位置。

CW_USEDEFAULT, // 初始的窗口y軸位置。

CW_USEDEFAULT, // 初始的窗口x軸大小。

CW_USEDEFAULT, // 初始的窗口y軸大小。

NULL, // 父窗口句柄。

NULL, // 窗口功能表句柄。

hInstance, // 應用程序實例句柄。

NULL // 建立參數,這個參數可以存取後面程序中可能引用到的資料。

);

ShowWindow(hwnd, iCmdShow);

UpdateWindow (hwnd);

//-----------------------------------------------------------------------------------------

//---------------------------- 消息循環 -------------------------------------------------

MSG msg ; // 建立消息對象。

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg);

//把虛擬鍵盤消息轉換到字符消息,滿足鍵盤輸入的需要,參數爲msg消息對象的地址。

DispatchMessage (&msg);

//把當前的消息發送到消息處理函數中去。

}

//----------------------------------------------------------------------------------------

return msg.wParam;//返回消息結構中的wParam成員信息。

}

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

// 窗口消息處理函數。

{

static int iLFx, iCFx, iFy ;

HDC hdc; // 創建設備描述句柄對象。

PAINTSTRUCT ps; // 創建繪制結構對象。

int i;

TCHAR szBuffer [10]; // 創建字符數組用于保存GetSystemMetrics函數返回的值。

TEXTMETRIC tm; // 創建TEXTMETRIC結構對象。

char szChar[200];

switch (message)

{

case WM_CREATE: // 當窗口創建的時候獲得WM_CREATE消息。

hdc = GetDC (hwnd); // 獲取設備描述表句柄。

GetTextMetrics (hdc, &tm);// 調用GetTextMetrics函數獲取字符大小相關信息。

iLFx = tm.tmAveCharWidth;

// 獲得小寫字符的平均寬度,小寫字母的加權平均值就是字符的平均寬度。

iCFx = (tm.tmPitchAndFamily & 1 ? 3 : 2) * iLFx / 2;

// 獲得大寫字符的平均寬度,對于變寬字體而言,大寫字符的平均寬度是iLFx乘以150%,而假如是等寬字體,那麽iCFx就等于iLFx。

iFy = tm.tmHeight + tm.tmExternalLeading;

// 字符高度等于字符准線上下最大縱向高度加行距。

ReleaseDC (hwnd, hdc) ;

return 0 ;

case WM_PAINT://通知窗口更新顯示區域的信息

hdc = BeginPaint (hwnd, &ps);

SetTextColor(hdc,RGB(255,0,0));

for (i = 0; i<NUMLINES; i++)

//通過獲取的define定義的NUMLINES進行叠代,以循環輸出字符串。

{

TextOut (hdc, 0, iFy*i, sysmetrics[i].szLabel,lstrlen (sysmetrics[i].szLabel));

/*

第一個輸出由于是從0位置開始,所以x軸爲0,y軸高度使用字符高度乘以循環次數獲得。

*/

TextOut (hdc, 22*iCFx, iFy*i, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));

/*

第二個輸出由于字符串的起始點有了變化所以必須空出第一列字符串的寬度。

22*iCFx的是由第一列最長字符串長度加上兩個空位得來,空位只是爲了美觀而多加上的。

*/

SetTextAlign (hdc, TA_RIGHT TA_TOP);

TextOut (hdc, 22*iCFx+40*iLFx, iFy*i, szBuffer,wsprintf (szBuffer, TEXT("%5d"),GetSystemMetrics (sysmetrics[i].Index)));

SetTextAlign (hdc, TA_LEFT TA_TOP);

/*

第三個輸出主要是輸出GetSystemMetrics函數返回的數值,但其中的確有些微妙。

由于變寬字符由左向右對齊數值的很難實現,所以我們換個思維而選擇從右向左的方式對齊。

調用SetTextAlign (hdc, TA_RIGHT TA_TOP);可以讓對齊方式轉變爲右向左對齊。

22*iCFx+40*iLFx,包含了前兩列的寬度,它的值成爲了第三列字符串的x軸結束位置。

輸出完成後調用SetTextAlign (hdc, TA_LEFT TA_TOP);讓對齊方式恢複默認,以便下一行的輸出。

*/

}

EndPaint (hwnd, &ps);

MessageBox(NULL,"此對話框以下遮蓋的部分需要更新!","覆蓋區域",0);

return 0;

case WM_DESTROY:

// 當窗口銷毀的時候會返回此信息,比如ALT+F4或關閉窗口的時候,系統默認調用DestroyWindow()函數撤消窗口。

PostQuitMessage (0);

return 0;

}

return DefWindowProc (hwnd, message, wParam, lParam);//處理不于處理的消息

}

格式化輸出 假如要使用TextOut函數在Windows應用程序中輸出多行文字,我們就必須先取得字符的寬度和高度,通常我們在窗口消息處理函數中處理WM_CREATE消息的時候調用GetTextMetrics函數來獲取他們,之所以放到WM_CREATE的部分調用,是因爲當系統啓動後,系統字體的大小就不會發生改變,我們只需要調用一次GetTextMetrics就可以了。 具體方法如下: case WM_CREATE: hdc = GetDC (hwnd); // 取得設備描述表句柄。 GetTextMetrics (hdc, &tm); // 調用GetTextMetrics函數將獲得的信息保存在緩沖區中。 iLFx = tm.tmAveCharWidth; // 獲得小寫字符的平均寬度,小寫字母的加權平均值就是字符的平均寬度。 iCFx = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2; // 獲得大寫字符的平均寬度,對于變寬字體而言,大寫字符的平均寬度是iLFx乘以150%,而假如是等寬字體,那麽iCFx就等于iLFx。 iFy = tm.tmHeight + tm.tmExternalLeading; // 字符高度等于字符准線上下最大縱向高度加行距。 ReleaseDC (hwnd, hdc) ; // 釋放設備描述表句柄。 return 0;   大家可能對上面代碼中的,tm.tmPitchAndFamily & 1 ? 3 : 2,這樣的寫法感到迷惑,TEXTMETRICS結構的tmPitchAndFamily屬性是用來判定字體是否爲變寬字體的,假如是等寬字體那麽它的低位就爲0,假如爲變寬字體那麽它的低位就爲1,所以通過位運算我們可以判定是否爲變寬字體,假如是就進行乘以150%的操作。   看到這裏,我們已經了解了TextOut函數輸出所需要的所有知識,下面我們將以一個完整的例子對它進一步的學習。 實例練習   例子目的是要將GetSystemMetrics函數所需要的參數以及這些參數的含義和返回值,以字符串的方式並格式化後循環輸出在屏幕上。   該例程我們分爲兩個文件,一個是用來保存GetSystemMetrics函數所需索引的頭文件,另一個則是程序的主文件,代碼的具體解釋見代碼的注釋部分。 代碼如下: /* sysmetrics.h 頭文件 */ #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) strUCt { int Index; // 索引 TCHAR* szLabel;// 索引的字符串表示 TCHAR* szDesc;// 索引含義 } sysmetrics [ ] = { SM_CXSCREEN, TEXT("SM_CXSCREEN"), TEXT("Screen width in pixels"), SM_CYSCREEN, TEXT("SM_CYSCREEN"), TEXT("Screen height in pixels"), SM_CXVSCROLL, TEXT("SM_CXVSCROLL"), TEXT("Vertical scroll width"), SM_CYHSCROLL, TEXT("SM_CYHSCROLL"), TEXT("Horizontal scroll height"), SM_CYCAPTION, TEXT("SM_CYCAPTION"), TEXT("Caption bar height"), SM_CXBORDER, TEXT("SM_CXBORDER"), TEXT("Window border width"), SM_CYBORDER, TEXT("SM_CYBORDER"), TEXT("Window border height"), SM_CXFIXEDFRAME, TEXT("SM_CXFIXEDFRAME"), TEXT("Dialog window frame width"), SM_CYFIXEDFRAME, TEXT("SM_CYFIXEDFRAME"), TEXT("Dialog window frame height"), SM_CYVTHUMB, TEXT("SM_CYVTHUMB"), TEXT("Vertical scroll thumb height"), SM_CXHTHUMB, TEXT("SM_CXHTHUMB"), TEXT("Horizontal scroll thumb width"), SM_CXICON, TEXT("SM_CXICON"), TEXT("Icon width"), SM_CYICON, TEXT("SM_CYICON"), TEXT("Icon height"), SM_CXCURSOR, TEXT("SM_CXCURSOR"), TEXT("Cursor width"), SM_CYCURSOR, TEXT("SM_CYCURSOR"), TEXT("Cursor height"), SM_CYMENU, TEXT("SM_CYMENU"), TEXT("Menu bar height"), SM_CXFULLSCREEN, TEXT("SM_CXFULLSCREEN"), TEXT("Full screen client area width"), SM_CYFULLSCREEN, TEXT("SM_CYFULLSCREEN"), TEXT("Full screen client area height"), SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"), TEXT("Kanji window height"), SM_MOUSEPRESENT, TEXT("SM_MOUSEPRESENT"), TEXT("Mouse present flag"), SM_CYVSCROLL, TEXT("SM_CYVSCROLL"), TEXT("Vertical scroll arrow height"), SM_CXHSCROLL, TEXT("SM_CXHSCROLL"), TEXT("Horizontal scroll arrow width"), SM_DEBUG, TEXT("SM_DEBUG"), TEXT("Debug version flag"), SM_SWAPBUTTON,TEXT("SM_SWAPBUTTON"), TEXT("Mouse buttons swapped flag"), SM_CXMIN, TEXT("SM_CXMIN"), TEXT("Minimum window width"), SM_CYMIN, TEXT("SM_CYMIN"), TEXT("Minimum window height"), SM_CXSIZE, TEXT("SM_CXSIZE"), TEXT("Min/Max/Close button width"), SM_CYSIZE, TEXT("SM_CYSIZE"), TEXT("Min/Max/Close button height"), SM_CXSIZEFRAME, TEXT("SM_CXSIZEFRAME"), TEXT("Window sizing frame width"), SM_CYSIZEFRAME, TEXT("SM_CYSIZEFRAME"), TEXT("Window sizing frame height"), SM_CXMINTRACK, TEXT("SM_CXMINTRACK"), TEXT("Minimum window tracking width"), SM_CYMINTRACK, TEXT("SM_CYMINTRACK"), TEXT("Minimum window tracking height"), SM_CXDOUBLECLK, TEXT("SM_CXDOUBLECLK"), TEXT("Double click x tolerance"), SM_CYDOUBLECLK, TEXT("SM_CYDOUBLECLK"), TEXT("Double click y tolerance"), SM_CXICONSPACING, TEXT("SM_CXICONSPACING"), TEXT("Horizontal icon spacing"), SM_CYICONSPACING, TEXT("SM_CYICONSPACING"), TEXT("Vertical icon spacing"), SM_MENUDROPALIGNMENT, TEXT("SM_MENUDROPALIGNMENT"), TEXT("Left or right menu drop"), SM_PENWINDOWS, TEXT("SM_PENWINDOWS"), TEXT("Pen extensions installed"), SM_DBCSENABLED, TEXT("SM_DBCSENABLED"), TEXT("Double-Byte Char Set enabled"), SM_CMOUSEBUTTONS, TEXT("SM_CMOUSEBUTTONS"), TEXT("Number of mouse buttons"), SM_SECURE, TEXT("SM_SECURE"), TEXT("Security present flag"), SM_CXEDGE, TEXT("SM_CXEDGE"), TEXT("3-D border width"), SM_CYEDGE, TEXT("SM_CYEDGE"), TEXT("3-D border height"), SM_CXMINSPACING, TEXT("SM_CXMINSPACING"), TEXT("Minimized window spacing width"), SM_CYMINSPACING, TEXT("SM_CYMINSPACING"), TEXT("Minimized window spacing height"), SM_CXSMICON, TEXT("SM_CXSMICON"), TEXT("Small icon width"), SM_CYSMICON, TEXT("SM_CYSMICON"), TEXT("Small icon height"), SM_CYSMCAPTION, TEXT("SM_CYSMCAPTION"), TEXT("Small caption height"), SM_CXSMSIZE, TEXT("SM_CXSMSIZE"), TEXT("Small caption button width"), SM_CYSMSIZE, TEXT("SM_CYSMSIZE"), TEXT("Small caption button height"), SM_CXMENUSIZE, TEXT("SM_CXMENUSIZE"), TEXT("Menu bar button width"), SM_CYMENUSIZE, TEXT("SM_CYMENUSIZE"), TEXT("Menu bar button height"), SM_ARRANGE, TEXT("SM_ARRANGE"), TEXT("How minimized windows arranged"), SM_CXMINIMIZED, TEXT("SM_CXMINIMIZED"), TEXT("Minimized window width"), SM_CYMINIMIZED, TEXT("SM_CYMINIMIZED"), TEXT("Minimized window height"), SM_CXMAXTRACK, TEXT("SM_CXMAXTRACK"), TEXT("Maximum draggable width"), SM_CYMAXTRACK, TEXT("SM_CYMAXTRACK"), TEXT("Maximum draggable height"), SM_CXMAXIMIZED, TEXT("SM_CXMAXIMIZED"), TEXT("Width of maximized window"), SM_CYMAXIMIZED, TEXT("SM_CYMAXIMIZED"), TEXT("Height of maximized window"), SM_NETWORK, TEXT("SM_NETWORK"), TEXT("Network present flag"), SM_CLEANBOOT, TEXT("SM_CLEANBOOT"), TEXT("How system was booted"), SM_CXDRAG, TEXT("SM_CXDRAG"), TEXT("Avoid drag x tolerance"), SM_CYDRAG, TEXT("SM_CYDRAG"), TEXT("Avoid drag y tolerance"), SM_SHOWSOUNDS, TEXT("SM_SHOWSOUNDS"), TEXT("Present sounds visually"), SM_CXMENUCHECK, TEXT("SM_CXMENUCHECK"), TEXT("Menu check-mark width"), SM_CYMENUCHECK, TEXT("SM_CYMENUCHECK"), TEXT("Menu check-mark height"), SM_SLOWMACHINE, TEXT("SM_SLOWMACHINE"), TEXT("Slow processor flag"), SM_MIDEASTENABLED, TEXT("SM_MIDEASTENABLED"), TEXT("Hebrew and Arabic enabled flag"), SM_MOUSEWHEELPRESENT, TEXT("SM_MOUSEWHEELPRESENT"), TEXT("Mouse wheel present flag"), SM_XVIRTUALSCREEN, TEXT("SM_XVIRTUALSCREEN"), TEXT("Virtual screen x origin"), SM_YVIRTUALSCREEN, TEXT("SM_YVIRTUALSCREEN"), TEXT("Virtual screen y origin"), SM_CXVIRTUALSCREEN, TEXT("SM_CXVIRTUALSCREEN"), TEXT("Virtual screen width"), SM_CYVIRTUALSCREEN, TEXT("SM_CYVIRTUALSCREEN"), TEXT("Virtual screen height"), SM_CMONITORS, TEXT("SM_CMONITORS"), TEXT("Number of monitors"), SM_SAMEDISPLAYFORMAT, TEXT("SM_SAMEDISPLAYFORMAT"), TEXT("Same color format flag") }; /* main.cpp 主文件 */ #include <windows.h> #include <stdio.h> #include "system.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) static char szAppName[] = TEXT("HelloWin"); // 預先定義一個c風格字符串,稍後用于設置窗口類名稱。 WNDCLASS wndclass; // 定義窗口類對象。 wndclass.style = CS_HREDRAW CS_VREDRAW; wndclass.lpfnWndProc = WndProc ; // 指定窗口的處理函數爲WndProc,WndProc將處理windows消息。 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; // 窗口類對象的名稱。 //----------------------------------------------------------------------------------------- RegisterClass (&wndclass); //-------------------------- 實例化過程 ------------------------------------------------- HWND hwnd ; //創建用于保存窗口句柄的對象,窗口句柄是系統識別不同窗口的依據,它只是個代號。 hwnd = CreateWindow( szAppName, // 窗口類名稱。 "GDI 入門", // 窗口標題。 WS_OVERLAPPEDWINDOWWS_HSCROLLWS_VSCROLL, // 窗口樣式。 CW_USEDEFAULT, // 初始的窗口x軸位置。 CW_USEDEFAULT, // 初始的窗口y軸位置。 CW_USEDEFAULT, // 初始的窗口x軸大小。 CW_USEDEFAULT, // 初始的窗口y軸大小。 NULL, // 父窗口句柄。 NULL, // 窗口功能表句柄。 hInstance, // 應用程序實例句柄。 NULL // 建立參數,這個參數可以存取後面程序中可能引用到的資料。 ); ShowWindow(hwnd, iCmdShow); UpdateWindow (hwnd); //----------------------------------------------------------------------------------------- //---------------------------- 消息循環 ------------------------------------------------- MSG msg ; // 建立消息對象。 while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); //把虛擬鍵盤消息轉換到字符消息,滿足鍵盤輸入的需要,參數爲msg消息對象的地址。 DispatchMessage (&msg); //把當前的消息發送到消息處理函數中去。 } //---------------------------------------------------------------------------------------- return msg.wParam;//返回消息結構中的wParam成員信息。 } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) // 窗口消息處理函數。 { static int iLFx, iCFx, iFy ; HDC hdc; // 創建設備描述句柄對象。 PAINTSTRUCT ps; // 創建繪制結構對象。 int i; TCHAR szBuffer [10]; // 創建字符數組用于保存GetSystemMetrics函數返回的值。 TEXTMETRIC tm; // 創建TEXTMETRIC結構對象。 char szChar[200]; switch (message) { case WM_CREATE: // 當窗口創建的時候獲得WM_CREATE消息。 hdc = GetDC (hwnd); // 獲取設備描述表句柄。 GetTextMetrics (hdc, &tm);// 調用GetTextMetrics函數獲取字符大小相關信息。 iLFx = tm.tmAveCharWidth; // 獲得小寫字符的平均寬度,小寫字母的加權平均值就是字符的平均寬度。 iCFx = (tm.tmPitchAndFamily & 1 ? 3 : 2) * iLFx / 2; // 獲得大寫字符的平均寬度,對于變寬字體而言,大寫字符的平均寬度是iLFx乘以150%,而假如是等寬字體,那麽iCFx就等于iLFx。 iFy = tm.tmHeight + tm.tmExternalLeading; // 字符高度等于字符准線上下最大縱向高度加行距。 ReleaseDC (hwnd, hdc) ; return 0 ; case WM_PAINT://通知窗口更新顯示區域的信息 hdc = BeginPaint (hwnd, &ps); SetTextColor(hdc,RGB(255,0,0)); for (i = 0; i<NUMLINES; i++) //通過獲取的define定義的NUMLINES進行叠代,以循環輸出字符串。 { TextOut (hdc, 0, iFy*i, sysmetrics[i].szLabel,lstrlen (sysmetrics[i].szLabel)); /* 第一個輸出由于是從0位置開始,所以x軸爲0,y軸高度使用字符高度乘以循環次數獲得。 */ TextOut (hdc, 22*iCFx, iFy*i, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc)); /* 第二個輸出由于字符串的起始點有了變化所以必須空出第一列字符串的寬度。 22*iCFx的是由第一列最長字符串長度加上兩個空位得來,空位只是爲了美觀而多加上的。 */ SetTextAlign (hdc, TA_RIGHT TA_TOP); TextOut (hdc, 22*iCFx+40*iLFx, iFy*i, szBuffer,wsprintf (szBuffer, TEXT("%5d"),GetSystemMetrics (sysmetrics[i].Index))); SetTextAlign (hdc, TA_LEFT TA_TOP); /* 第三個輸出主要是輸出GetSystemMetrics函數返回的數值,但其中的確有些微妙。 由于變寬字符由左向右對齊數值的很難實現,所以我們換個思維而選擇從右向左的方式對齊。 調用SetTextAlign (hdc, TA_RIGHT TA_TOP);可以讓對齊方式轉變爲右向左對齊。 22*iCFx+40*iLFx,包含了前兩列的寬度,它的值成爲了第三列字符串的x軸結束位置。 輸出完成後調用SetTextAlign (hdc, TA_LEFT TA_TOP);讓對齊方式恢複默認,以便下一行的輸出。 */ } EndPaint (hwnd, &ps); MessageBox(NULL,"此對話框以下遮蓋的部分需要更新!","覆蓋區域",0); return 0; case WM_DESTROY: // 當窗口銷毀的時候會返回此信息,比如ALT+F4或關閉窗口的時候,系統默認調用DestroyWindow()函數撤消窗口。 PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam);//處理不于處理的消息 }
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有