44 VC++绘制窗口(WinAPI/WinMain) - 雪炭网

VC++绘制窗口(WinAPI/WinMain)2015-02-01 19:34:34

( 1人已投票,[高质量] )
分享:
31.3K

VC++通过调用WinAPI来绘制基础窗口的的代码,见如下:


#include <windows.h>
     
struct
{
      int  iStyle ;
      TCHAR *szText ;
}
     
button[] =   
{   
      BS_PUSHBUTTON,    TEXT ("PUSHBUTTON"),
      BS_DEFPUSHBUTTON,   TEXT ("DEFPUSHBUTTON"),
      BS_CHECKBOX,     TEXT ("CHECKBOX"),
      BS_AUTOCHECKBOX,     TEXT ("AUTOCHECKBOX"),
      BS_RADIOBUTTON,    TEXT ("RADIOBUTTON"),
      BS_3STATE,      TEXT ("3STATE"),
      BS_AUTO3STATE,    TEXT ("AUTO3STATE"),
      BS_GROUPBOX,     TEXT ("GROUPBOX"),
      BS_AUTORADIOBUTTON,   TEXT ("AUTORADIO"),
      BS_OWNERDRAW,      TEXT ("OWNERDRAW")
     
} ;
     
#define NUM (sizeof button / sizeof button[0])
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,   
                             PSTR szCmdLine, int iCmdShow)   
{   
      static TCHAR szAppName[] = TEXT ("BtnLook") ;
      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 ("Button Look"),
                 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 HWND hwndButton[NUM] ;
      static RECT  rect ;
      static TCHAR szTop[] = TEXT ("message  wParam lParam"),
      szUnd[] = TEXT ("_______  ______ ______"),
      szFormat[] = TEXT ("%-16s%04X-%04X  %04X-%04X"),
            szBuffer[50] ;
        static int  cxChar, cyChar ;    
        HDC hdc ;
        PAINTSTRUCT ps ;
    // HFONT hF;
    //hF=GetStockObject(ANSI_VAR);
     int i ;     
     switch (message)   
      {   
      case WM_CREATE :
             cxChar = LOWORD (GetDialogBaseUnits ()) ;
     
             cyChar = HIWORD (GetDialogBaseUnits ()) ;
     
         for (i = 0 ; i < NUM ; i++)
     
         hwndButton[i] =CreateWindow (
                        TEXT("button"),  //类别名称
                        button[i].szText, //窗口文字
                        WS_CHILD | WS_VISIBLE | button[i].iStyle,//窗口样式
                        cxChar,  //x位置
                        cyChar * (1 + 2 * i), //y位置
                        20 * cxChar, //宽度
                        7 * cyChar / 4,//高度
                        hwnd,  //父窗口
                        (HMENU) i,//子窗口ID
                        ((LPCREATESTRUCT)lParam)->hInstance, //执行实体句柄
                        NULL //附加参数
                         ) ;   
         return 0 ;
      case  WM_SIZE :   
         rect.left = 24 * cxChar ;   
         rect.top  = 2 * cyChar ;   
         rect.right = LOWORD (lParam) ;   
         rect.bottom = HIWORD (lParam) ;   
         return 0 ;   
      case  WM_PAINT :   
         InvalidateRect (hwnd, &rect, TRUE) ;
          hdc = BeginPaint (hwnd, &ps) ;
         //SelectObject(hdc,hF) ;   
         SetBkMode (hdc, TRANSPARENT) ;   
         TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;   
         TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;   
         EndPaint (hwnd, &ps) ;   
         return 0 ;     
     
      case  WM_DRAWITEM :   
      case  WM_COMMAND :
     
         ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
          hdc = GetDC (hwnd) ;
          //SelectObject(hdc, hF) ;
          TextOut( hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
           szBuffer,
            wsprintf (szBuffer, szFormat,
             message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") :
               TEXT ("WM_COMMAND"),
               HIWORD (wParam), LOWORD (wParam),
                HIWORD (lParam), LOWORD (lParam))) ;
            ReleaseDC (hwnd, hdc) ;
             ValidateRect (hwnd, &rect) ;
             break ;
          case  WM_DESTROY :
             PostQuitMessage (0) ;   
             return 0 ;   
       }   
return DefWindowProc (hwnd, message, wParam, lParam) ;
}




相关推荐:




头像

snowcoal
  • VC++
  • 绘制窗口
  • WinAPI

本文标签:

VC++绘制窗口WinAPI

收藏到我的私密空间

标题:VC++绘制窗口(WinAPI/WinMain)

作者:柳岸花明

你暂未登录,请登录后才可收藏至您的私密空间 确认取消
雪炭网

键盘操作 更便捷 -雪炭网雪中送炭-乐趣无限

如果本站的内容有幸帮助到了您,建议您了解一下当页的广告内容哦,我们的进步离不开您的支持,Thank you~