在視窗程式中總是少不了會有那麼的機會想以圖面的方式來表達,不管是表格的方式或是些什麼的,因此我們就先從畫一條直線開始。還記得上回的 建立下拉式選單嗎? 這次我們就從下拉式功能選單來畫一條直線,同時也另增創一個視窗訊息 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;
重新編譯並執行。
如上圖,只要一載入程式就已經畫一條線了。
再點選 [編輯][畫一條線]。
好了,現在已經有兩條直線了,你改變一下視窗的大小就會發現,有一條線不見了。因此,相同的程式碼放在不同的位置段就會有不同的結果,或許這就是視窗程式迷〖惑〗人的地方。
接下來我們來看看函式
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) ;
}
延伸閱讀