視窗:基於基類CApplication-菜單、對話框及全屏(四)
這次我們要來討論的是菜單的使用和全屏模式(全屏模式中還有菜單欄,有些奇怪~:)),我們越來越接近一個遊戲的編程了。看看程式運行效果:
好,廢話少說go go!
(工程文件打包下載,點擊這裡)
先説明,咱們編出來的程式將會是:運行此程式進入全屏模式,黑色背景最上有一個菜單欄,單擊“檔案”菜單彈出“退出”選項,單擊退出之,“幫助”菜單有“關於...”選項,單擊彈出“關於”對話框(模態),單擊其上“確定”按鈕返回。
夠簡單吧,先來製造菜單!
插入->MENU,在左上角的虛綫小框上雙擊,“標題”中輸入“檔案(&F)”,再在下面的虛綫方框上雙擊,標題中輸入“退出(&E)”,前面的“ID”中輸入“IDM_FILE_EXIT”(不要引號),這個ID是以後引用此選項的標識,要與代碼中的吻合。以此類推再造個“幫助(&H)”及其中之“關於...()&A”選項(ID:IDM_HELP_ABOUT)。再在菜單欄幼雛白條中雙擊,更改菜單欄ID為“IDR_MENU”。
接著添加“關於”對話框,它也是資源。
插入->Dialog->(按回車)(哎~~~),先把那個“Cancel”按鈕去掉(單擊它再按鍵盤上的“Delete”鍵)。雙擊“OK”按鈕,將“標題”中的内容改成“確定”(支持中文嘛~~~)。在窗口空白処雙擊更改窗口“ID”改爲“IDD_ABOUT”,標題改爲“關於”。從右邊的工具欄中添加“Static Text”控件進來,裏面加幾句話,比如“哈哈哈”之類,哈哈哈。
別忘了添加圖標、光標,然後再保存什麽的,不懂可以回顧一下上一節“視窗:遊戲基類CApplication-圖光標(三)”。
下面來添加代碼:
/
/// main.h //
/
#pragma once
#include <windows.h>
//主窗口過程聲明
LRESULT CALLBACK
WinProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
//“關於”窗口過程聲明
BOOL CALLBACK
DialogAboutProc(HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam);
/// eof /
應用程式主文件:
/
/// main.cpp //
/
#include <windows.h>
#include "CApplication.h"
#include "main.h"
#include "resource.h"
CApplication App;
//消息處理
LRESULT CALLBACK WinProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
static HINSTANCE hInstance;
switch(uMsg)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
return 0;
//菜單之使用
case WM_COMMAND:
switch(LOWORD(wParam))
{
//檔案->退出
case IDM_FILE_EXIT:
SendMessage(hWnd, WM_CLOSE, 0, 0);
return 0;
//幫助->關於
case IDM_HELP_ABOUT:
DialogBox(hInstance,
MAKEINTRESOURCE(IDD_ABOUT),
hWnd,
(DLGPROC)DialogAboutProc);
return 0;
}
return 0;
}
return App.MsgProc(hWnd, uMsg, wParam, lParam);
}
//“關於”對話框窗口過程
BOOL CALLBACK DialogAboutProc(HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
//
return TRUE;
case WM_CLOSE:
EndDialog(hDlg, 0);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
//"確定"按鈕
case IDOK:
EndDialog(hDlg, 0);
return TRUE;
}
}//第一個switch閉合
return FALSE;
}
//主程式入口
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
App.Set_hIcon(hInstance, IDI_LANDHOLDER);
App.Set_hCursor(hInstance, IDC_LANDHOLDER);
App.Set_hMenu(hInstance, IDR_MENU);
//窗口大小設置
App.isFullScreen(TRUE);
//App.SetScreenW(400);
//App.SetScreenH(300);
//客戶區背景色
App.SetClientBKColor(BLACK_BRUSH);
//創建窗口
App.CreateWin(WinProc,
hInstance,
"斗地主",
WS_OVERLAPPEDWINDOW);
//運行默認的消息循環機制
return App.RunDefault();
}
/// eof ///
解釋:
這次除上幾次的CApplication.h、CApplication.cpp、main.cpp外又多了main.h文件,因爲這次多了個“關於”對話框(窗口),有窗口就有相對應的“窗口過程”(窗口處理函數),東西一多最好集合起來聲明,所以單獨造個頭文件,不要在局限于以前的小型程式了。
主窗口過程WinProc比上一節的多了不少東西,,主要是對菜單消息處理的,我們來研究研究。
代碼引用///
//菜單之使用
case WM_COMMAND:
switch(LOWORD(wParam))
{
//檔案->退出
case IDM_FILE_EXIT:
SendMessage(hWnd, WM_CLOSE, 0, 0);
return 0;
//幫助->關於
case IDM_HELP_ABOUT:
DialogBox(hInstance,
MAKEINTRESOURCE(IDD_ABOUT),
hWnd,
(DLGPROC)DialogAboutProc);
return 0;
}
///結束引用///
首先在消息處理中多了個“WM_COMMAND”消息,它就是用戶對菜單動作產生的消息,有“WM_COMMAND”消息表示菜單有動作,具體什麽動作在參數wParam裏,所以又嵌套了個switch:如果是“IDM_FILE_EXIT”消息表示“檔案”中的“退出”選項被單擊了(因爲菜單中“退出”選項的“ID”是“IDM_FILE_EXIT”還記得不?),那麽調用它的處理過程;“關於”選項的也是,它毫不猶豫的調用了個DialogBox函數用來在屏幕上顯示我們造好的那個“關於”對話框(函數參數中的“IDD_ABOUT”即是那個對話框的“ID”)。好,進入“關於”對話框中的事情就有此對話框之窗口過程來完成了。
“關於”對話框窗口過程“DialogAboutProc”:
/代碼引用///
case WM_INITDIALOG:
//
return TRUE;
case WM_CLOSE:
EndDialog(hDlg, 0);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
//"確定"按鈕
case IDOK:
EndDialog(hDlg, 0);
return TRUE;
}
}//第一個switch閉合
return FALSE;
//引用結束//
很簡單,四條消息之處理,注意嵌套關係。
“WM_COMMAND”下的“IDOK”就是那個“確定”按鈕被單擊了,所以就要EndDialog。
好了,菜單、對話框之破事兒完了,我們再來看看全屏的問題。
全屏已經在CApplication類中封裝好了,我們只要在主程式入口WinMain中“App.isFullScreen(TRUE);”一道就行了(以前是什麽“App.SetScreenW(400);//窗口寬度”又“App.SetScreenH(300);//窗口高度”。
ok,大功告成,趕緊編譯構建!
該死的csdn不能插圖,for(;1;){該死!}