視窗:基於基類CApplication-菜單、對話框及全屏(四)

 視窗:基於基類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;){該死!}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值