溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言實現(xiàn)SDK窗口編程

發(fā)布時間:2020-07-07 21:05:36 來源:網(wǎng)絡(luò) 閱讀:866 作者:Chinayu2014 欄目:編程語言
//---------------------------------------------------------------------------
#include <windows.h>
//===========================================================================
long __stdcall WndProc(HWND hwnd,UINT msg,WPARAM WParam,LPARAM LParam)  
{  
    switch(msg)  
    {  
        case WM_CLOSE:  
            PostQuitMessage(0);  
            break;  
        case WM_LBUTTONDOWN:  
            MessageBoxA(0,"ok","提示",0);  
            PostQuitMessage(0);  
            break;  
        case WM_PAINT:  
        {  
            HDC hdc;  
            hdc = GetDC(hwnd);  
  
            RECT rect;  
            GetClientRect(hwnd,&rect);  
              
            rect.left   = rect.right/2;  
            rect.top    = rect.bottom/2;  
            rect.right  = rect.left+50;  
            rect.bottom = rect.top+30;  
  
            DrawText(hdc,"hello",5,&rect,0);  
  
            ReleaseDC(NULL,hdc);  
        }  
        default:  
            return DefWindowProc(hwnd,msg,WParam,LParam);  
    }  
  
    return 0;  
}  

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreHinstance, LPSTR, int)
{
     g_hIns = hInstance;
     WNDCLASS theClass ={0};
     char * lpszClassName = "myClass";
     char * lpszTitle     = "測試窗口";
     HWND hwnd;
     MSG  msg;

     theClass.style       = 0;//缺省窗口風(fēng)格
     theClass.lpfnWndProc = WndProc;
     theClass.cbClsExtra  = 0;//窗口類無擴展
     theClass.cbWndExtra  = 0;//窗口實例無擴展

     theClass.hInstance =  hInstance;

     //窗口的最小化圖標(biāo)為缺省圖標(biāo),即窗口左上角圖標(biāo)
     //VC中資源ID為IDI_APPLICATION
     //在BCB中資源名為MAINICON
     theClass.hIcon=LoadIcon(hInstance,"MAINICON");

     theClass.hCursor=LoadCursor(NULL,IDC_ARROW);                  //窗口采用箭頭光標(biāo)
     theClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //窗口背景為白色
     theClass.lpszMenuName=NULL;             //窗口無菜單
     theClass.lpszClassName=  lpszClassName; //窗口類名為"窗口"

     if(!RegisterClass(&theClass)) //如果注冊失敗 發(fā)出警告
     {
          MessageBeep(0);
          return FALSE;
     }

     hwnd=CreateWindow( lpszClassName, //窗口類名
      lpszTitle,           //窗口標(biāo)題名
      WS_OVERLAPPEDWINDOW, //窗口的風(fēng)格
      CW_USEDEFAULT,       //窗口左上角坐標(biāo)值為缺省值
      CW_USEDEFAULT, 
      500, 300,            //窗口的寬和高
      NULL,                //此窗口無父窗口
      NULL,                //此窗口無子菜單
      hInstance,           //創(chuàng)建此窗口的應(yīng)用程序的當(dāng)前句柄
      NULL                 //不使用該值
      );

     ShowWindow(hwnd,SW_SHOW);
     UpdateWindow(hwnd);


     while(true)
     {
         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
         {
           if (msg.message == WM_QUIT)
               break;

           TranslateMessage(&msg);
           DispatchMessage(&msg);

         }

//         if (GetMessage (&msg, NULL, 0, 0))
//         {
//               TranslateMessage (&msg) ;
//               DispatchMessage (&msg) ;
//         }
//         else
//           break;
     }
     
     return msg.wParam; //消息循環(huán)結(jié)束 即程序結(jié)束時 將信息返回系統(tǒng)
}

PeekMessage與GetMessage函數(shù)處理不相同,兩種方式都可以.PeekMessage是不阻塞的,GetMessage是線程阻塞的,內(nèi)部處理退出消息,所以不用判斷退出消息,關(guān)閉時,就跳到break結(jié)束循環(huán)。要在WM_PAINT消息中繪圖,可用如下代碼:

PAINTSTRUCT ps ={0};  
HDC hdc = BeginPaint(hwnd,&ps);  
  
//HPEN hPen = GetStockObject(WHITE_PEN);  
HPEN hPen = CreatePen(PS_DASHDOTDOT,1,RGB(255 , 0 , 0 ));  
HGDIOBJ oldPen = (HGDIOBJ)SelectObject(hdc,hPen);  
if(!oldPen)  
{  
    int err = GetLastError();  
    char buff[20]={0};  
    itoa(err,buff,10);  
    OutputDebugStringA(buff);  
}  
//畫矩形  
Rectangle(hdc,20,30,80,120);  
//畫線  
MoveToEx ( hdc , 20 , 10 , NULL );  
LineTo( hdc , 200 ,100);  
  
SelectObject(hdc, oldPen);  
  
  
DeleteObject(hPen);  
EndPaint(hwnd,&ps);
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI