WINDOWS GDI初学:第一篇

 

头文件:

 //SYSMETS.H -- System metrics display structure 
//#include <windows.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"), 
	#if 1
	//===========以下7个宏,在VC6.0编译器的头文件里找不到=======================
	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") 
	#endif 
} ;


 


 如果要使用上面 注释的7个宏,那么就需要在 主C文件中的  #include "sysmets.h"   之前定义 WINVER这个宏。

 

#define WINVER 0x0500

#include "sysmets.h"

 

否则编译会报错,找不到上面7个宏。

因为 WINUSER.H 里是这么定义这七个宏的:

 

 4682 #if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
 4683 #define SM_MOUSEWHEELPRESENT    75
 4684 #endif
 4685 #if(WINVER >= 0x0500)  //必须WINDOWS的版本必须大于 0x0500,才会使用如下7个宏。
 4686 #define SM_XVIRTUALSCREEN       76
 4687 #define SM_YVIRTUALSCREEN       77
 4688 #define SM_CXVIRTUALSCREEN      78
 4689 #define SM_CYVIRTUALSCREEN      79
 4690 #define SM_CMONITORS            80
 4691 #define SM_SAMEDISPLAYFORMAT    81
 4692 #endif /* WINVER >= 0x0500 */

 

可能由于头文件太老等原因 会报如下错误(即便你已经在主C文件中定义了#define WINVER 0x0500): 

 e:\mywork\win_prj\win_scroll\main.cpp(4) : warning C4005: 'WINVER' : macro redefinition
        d:\program files\microsoft visual studio\vc98\include\windows.h(22) : see previous definition of 'WINVER'

那么,再CTRL+F7编译一次就可以了。

 

如果还报 找不到上述宏的错误。那就试试 #undef  WINVER  接着再  #define WINVER 0x0500

 

 

主C文件 :

#include <windows.h>
#include <stdio.h>

#define WINVER 0x0500

#include "sysmets.h" 
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                            PSTR szCmdLine, int iCmdShow) 
{ 
    static TCHAR szAppName[] = TEXT ("SysMets1") ; 
    HWND  hwnd ; 
    MSG    msg ; 
    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 ("This program requires Windows NT!"),  
        szAppName, MB_ICONERROR) ; 

        return 0 ; 
    } 

    hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 1"), 
                        WS_OVERLAPPEDWINDOW, 
                        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 lParam) 
{ 
  static int cxChar, cxCaps, cyChar ; 
  HDC         hdc ; 
  int         i ; 
  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) ; 
    return 0 ; 
 
case  WM_PAINT : 
    hdc = BeginPaint (hwnd, &ps) ; 

    for (i = 0 ; i < NUMLINES ; i++)
    { 
        TextOut(hdc, 0, cyChar * i,                       
                    sysmetrics[i].szLabel, 
                    lstrlen (sysmetrics[i].szLabel)) ; 

        TextOut(hdc, 22 * cxCaps, cyChar * i,       
                    sysmetrics[i].szDesc, 
                    lstrlen (sysmetrics[i].szDesc)) ; 

        SetTextAlign (hdc, TA_RIGHT | TA_TOP) ; 
        TextOut (hdc, 22 * cxCaps + 40 * cxChar, cyChar * i,  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, lParam) ; 
}


 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值