在視窗程式中總是少不了會有那麼的機會想以圖面的方式來表達,不管是表格的方式或是些什麼的,因此我們就先從畫一條直線開始。還記得上回的  建立下拉式選單嗎? 這次我們就從下拉式功能選單來畫一條直線,同時也另增創一個視窗訊息  case WM_PAINT 來畫一條直線,來看看差別在哪裡?


我們再載入先前的 main.cpp 以及 resource.rc。

修改一下
#define IDM_Demo2      1002
成為    
#define IDM_Line       1002

記得 main.cpp 以及 resource.rc 都要修改。

 

另外在LRESULT CALLBACK WndProc (....)
{

switch (message)
{
增加一個宣告 HDC hdc;    


也增加一個視窗訊息。

case WM_PAINT:
    hdc = GetDC(hwnd);
    MoveToEx(hdc,80,80,NULL);
    LineTo(hdc,150,80);
    ReleaseDC(hwnd,hdc);
    return 0;

 

修改一下
case IDM_Demo2:
成為
case IDM_Line:


     {  

    hdc = GetDC(hwnd);
    MoveToEx(hdc,20,20,NULL);
    LineTo(hdc,150,20);
    ReleaseDC(hwnd,hdc);
     }  
       break; 

重新編譯並執行。

 

 

1.bmp
 

 

如上圖,只要一載入程式就已經畫一條線了。


 

 

 

2.bmp
 

 

再點選 [編輯][畫一條線]。


 

 

 

3.bmp
 

 

 

好了,現在已經有兩條直線了,你改變一下視窗的大小就會發現,有一條線不見了。因此,相同的程式碼放在不同的位置段就會有不同的結果,或許這就是視窗程式迷〖惑〗人的地方。


接下來我們來看看函式 

MoveToEx(HDC  hdc, int x, int  y, LPPOINT lppt);
hdc,輸出裝置指引碼。
int x,新位置的X軸座標值。
int y,新位置的Y軸座標值。
LPPOINT lppt,儲存還沒移動之前的舊座標的位址指標,如果不保留原本舊座標的位址指標就填入NULL。

 
LineTo(HDC hdc, int x, int y);
hdc,輸出裝置指引碼。
int x,指定所畫的線的終點X軸座標值。
int y,指定所畫的線的終點Y軸座標值。

 

 

。,、'﹕︰﹔﹖﹑•!?!﹪%*﹡﹢ 我是可愛的分隔線  〈〉『』〖〗[]《》〔〕  「」【】﹁﹃︻﹂﹄︼


resource.rc


#define IDM_Demo1       1001      
#define IDM_Line        1002    //  設定選單識別碼  

DODO MENU 
{
    POPUP "檔案 "
    {
      MENUITEM "&開新檔案", IDM_Demo1  
            // 請自行增加其他功能 例如: MENUITEM "&開啟舊檔", IDM_Demo11 
           // 所有想歸類在 "檔案 " 底下的功能選項都寫在這邊 
    }
    POPUP "編輯"
    {
    
 MENUITEM "&劃一條線", IDM_Line  // 製作成畫線功能 
           //  你還可以增加任何你要的功能..如:畫兩條線... 
    }
}

。,、'﹕︰﹔﹖﹑•!?!﹪%*﹡﹢ 我是可愛的分隔線  〈〉『』〖〗[]《》〔〕  「」【】﹁﹃︻﹂﹄︼

 

 

main.cpp

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#define IDM_Demo1      1001    
#define IDM_Line       1002    // 設定選單識別碼 


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


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
char szAppName[] = "HelloWin";
HWND hwnd ;
MSG msg ;
WNDCLASSEX wndclass ;
wndclass.cbSize = sizeof(WNDCLASSEX) ;
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 = GetSysColorBrush(COLOR_3DFACE);
wndclass.lpszMenuName = "DODO";  
wndclass.lpszClassName = szAppName ;
wndclass.hIconSm = 0 ;

RegisterClassEx (&wndclass);


hwnd = CreateWindowEx (
0,
szAppName, 

"視窗標題 Draw a line",   //  改一下視窗標題名字..純屬好玩 
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)
{

switch (message)
{

HDC hdc;    // 先宣告 
                             //增加這段程式碼 ↓↓↓
case WM_PAINT:
    hdc = GetDC(hwnd);
    MoveToEx(hdc,80,80,NULL);
    LineTo(hdc,150,80);
    ReleaseDC(hwnd,hdc);
    return 0;
                             //增加這段程式碼  ↑↑↑

case WM_CREATE:
     return 0 ;
    
case WM_COMMAND:                        
        switch(LOWORD(wParam))
    { 
            case IDM_Demo1:
                 
              break;
            
            
case IDM_Line:    // 修改一下 
                     {                     //增加這段程式碼 ↓↓↓ 
                     hdc = GetDC(hwnd);
                     MoveToEx(hdc,20,20,NULL);
                     LineTo(hdc,150,20);
                     ReleaseDC(hwnd,hdc);
                 }  
                break;                    //增加這段程式碼  ↑↑↑ 

      } 
       
       return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}


return DefWindowProc (hwnd, message, wParam, lParam) ;
}

 


 

 

 

 

 

延伸閱讀

 

 

 

[伊蒙 dev c++] 視窗程式學習筆記

 

[做中學 dev c++] dev c++

 

 

 

 

 

 

 

arrow
arrow
    文章標籤
    在視窗中繪圖畫直線
    全站熱搜

    伊蒙‧普羅客 發表在 痞客邦 留言(6) 人氣()