1. 程式人生 > >建立選單;MAKEINTRESOURCE;選單加入視窗的兩種方式

建立選單;MAKEINTRESOURCE;選單加入視窗的兩種方式

MAKEINTRESOURCE是一個資源名轉換的巨集,這個巨集是把一個數字型別轉換指標型別的巨集,它不存在釋放的問題。

選單加入視窗的兩種方式

第一種是類級別的,也就是我們在設計視窗類時,直接指定給WNDCLASS結構的lpszMenuName成員,這樣做意味著,在呼叫CreateWindow函式建立視窗時,無論你是否為視窗指定選單,最終顯示的視窗上都會有選單,因為它是基於整個視窗類的。

[cpp] view plain copy  print?
  1. // 在這裡把選單附加上,成為類級別
  2. wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN);//整個選單資源的ID,不是選單項
[cpp] view plain copy  print?
  1. HWND hm = CreateWindow(  
  2.     L"MainWd",  
  3.     L"我的應用程式",  
  4.     WS_OVERLAPPEDWINDOW,  
  5.     25,  
  6.     18,  
  7.     380,  
  8.     280,  
  9.     NULL,  
  10.     NULL,  
  11.     hthisInstance,  
  12.     NULL);  

這樣在我們建立視窗時,哪怕你把hMenu引數設為NULL,最後顯示的視窗都會有選單,因為選單是屬於視窗類本身的。

另一種方式,就是不設定為類級別的選單,而是在呼叫CreateWindow時指定給hMenu引數。

[cpp] view plain copy  print?
  1. HWND hm = CreateWindow(  
  2.     L"MainWd",  
  3.     L"我的應用程式",  
  4.     WS_OVERLAPPEDWINDOW,  
  5.     25,  
  6.     18,  
  7.     380,  
  8.     280,  
  9.     NULL,  
  10.     LoadMenu(hthisInstance,MAKEINTRESOURCE(IDR_MAIN)),  
  11.     hthisInstance,  
  12.     NULL);  

同時我們把設計視窗類時設定選單的程式碼註釋掉。

[cpp] view plain copy  print?
  1. // 在這裡把選單附加上,成為類級別
  2. //wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN);//整個選單資源的ID,不是選單項

然後,我們執行這個程式,它還是有選單的。


方法一,用程式碼新增選單

這種方法的思路是:首先在全域性範圍內定義一個HMENU的變數,用來儲存視窗中選單欄的控制代碼,根選單(選單欄)可以CreateMenu函式來建立,接著可以使用AppendMenu函式或者InsertMenuItem函式來建立選單項。

控制代碼就是記憶體中各種資源的ID,比如圖示,圖片,字串等。我們的選單也是一種資源。

下面我寫了一個函式,用來動態建立選單。

[cpp] view plain copy  print?
  1. void CreateMyMenu()  
  2. {  
  3.     hRoot = CreateMenu();  
  4.     if(!hRoot)  
  5.         return;  
  6.     HMENU pop1 = CreatePopupMenu();  
  7.     AppendMenu(hRoot,  
  8.         MF_POPUP,  
  9.         (UINT_PTR)pop1,  
  10.         L"操作");  
  11.     // 一種方法是使用AppendMenu函式
  12.     AppendMenu(pop1,  
  13.         MF_STRING,  
  14.         IDM_OPT1,  
  15.         L"飛機");  
  16.     // 另一種方法是使用InsertMenuItem函式
  17.     MENUITEMINFO mif;  
  18.     mif.cbSize = sizeof(MENUITEMINFO);  
  19.     mif.cch = 100;  
  20.     mif.dwItemData  = NULL;  
  21.     mif.dwTypeData = L"機關槍";  
  22.     mif.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;  
  23.     mif.fState = MFS_ENABLED;  
  24.     mif.fType = MIIM_STRING;  
  25.     mif.wID = IDM_OPT2;  
  26.     InsertMenuItem(pop1,IDM_OPT2,FALSE,&mif);  
  27. }  


hRoot是在外部定義的全域性變數,儲存選單欄的標識。完整的程式碼如下:

[cpp] view plain copy  print?
  1. #include <Windows.h>
  2. #define IDM_OPT1     301
  3. #define IDM_OPT2     302
  4. HMENU hRoot;  
  5. void CreateMyMenu();//建立選單
  6. LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);  
  7. int CALLBACK WinMain(HINSTANCE hInstance,  
  8.                     HINSTANCE hPrevInstance,  
  9.                     LPSTR cmdLine,  
  10.                     int nShow)  
  11. {  
  12.     CreateMyMenu();//建立選單
  13.     WCHAR* cn = L"Myapp";  
  14.     WNDCLASS wc={   };  
  15.     wc.hbrBackground = (HBRUSH)COLOR_WINDOW;  
  16.     wc.lpszClassName = cn;  
  17.     wc.style = CS_HREDRAW | CS_VREDRAW;  
  18.     wc.hInstance = hInstance;  
  19.     wc.lpfnWndProc = (WNDPROC)MyWinProce;  
  20.     RegisterClass(&wc);  
  21.     HWND hm = CreateWindow(cn,  
  22.         L"我的應用程式",  
  23.         WS_OVERLAPPEDWINDOW,  
  24.         20,  
  25.         15,  
  26.         420,  
  27.         360,  
  28.         NULL,  
  29.         hRoot,  
  30.         hInstance,  
  31.         NULL);  
  32.     if( hm == NULL )  
  33.         return 0;  
  34.     ShowWindow(hm,nShow);  
  35.     MSG msg;  
  36.     while(GetMessage(&msg,NULL,0,0))  
  37.     {  
  38.         TranslateMessage(&msg);  
  39.         DispatchMessage(&msg);  
  40.     }  
  41.     return 0;  
  42. }  
  43. LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)  
  44. {  
  45. 相關推薦

    建立github遠端倉庫與本地連線的方式

    準備 下好Git Bash和註冊github賬號 建立ssh公鑰 bash下 ssh-keygen -t rsa -C "[email protected]" 到C:\Users\City.ssh下複製id_rsa.pub的內容 在github 賬號 的setti

    win32 視窗 方式顯示字串

    vs2013 新建一個win32 應用程式 ,專案名稱:HelloTextOut,空專案。 新增一個原始檔,名字為 HelloTextOut.cpp 內容為: #include <windows.h> #include <stdlib

    建立選單MAKEINTRESOURCE選單加入視窗方式

    MAKEINTRESOURCE是一個資源名轉換的巨集,這個巨集是把一個數字型別轉換成指標型別的巨集,它不存在釋放的問題。 選單加入視窗的兩種方式 第一種是類級別的,也就是我們在設計視窗類時,直接指定給WNDCLASS結構的lpszMenuName成員,

    建立資源的方式

    命令 vs 配置檔案 Kubernetes 支援兩種方式建立資源: 1. 用 kubectl 命令直接建立 kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2   在命令列中通過引數指定資源的屬性。 2.

    建立的程序的方式與常用屬性

    建立程序的兩種方式 第一種使用multprocessing 開啟子程序第二種使用自定義的方式(設計繼承程序類的方式) from multiprocessing import Process class MyProcess(Process): def run(self): p

    spring4+ThreadPoolTaskExecutor建立執行緒 方式傳送郵件

    百度雲程式碼下載地址包含測試用例 :點選後跳轉 ThreadService package com.konglingfu.service; public interface ThreadService extends Runnable{ public void se

    匿名內部類建立執行緒的方式

    我們知道多執行緒的實現有兩種方式,一種是繼承Thread類,另一種是實現Runnable介面,然後再重寫run方法,最後開啟執行緒。我們在普通的建立執行緒中,顯然是比較麻煩的,那麼有沒有一個簡單的方法呢?今天小錢就給大家介紹使用匿名內部類建立執行

    python多執行緒———2、建立多執行緒的方式

     法一、使用Thread類例項化 法二、繼承Thread來實現多執行緒 #對於io操作來說,多執行緒和多程序效能差別不大 #1、使用Thread類例項化 import time import threading def get_detail_html(url): prin

    Python多工(2.執行緒(建立執行緒的方式))

    Python中threading模組 可以總結出:    (1)當呼叫Thread的時候,不會建立執行緒 (2)呼叫Thread創建出來的例項物件的start方法的時候,才會建立執行緒以及讓這個執行緒開始執行      

    java建立單鏈表的方式

    /** * */ /** * @author jueying: * @version 建立時間:2018-10-23 下午01:26:47 * 類說明 */ /** * @author jueying * */ public class Test {

    Java執行緒建立方式

    package test; /**  * 建立執行緒  *  */ public class Demo1 {      public static void main(String arg[]){

    GitHub建立分支方式

    一:需求背景          1.1 開發新功能和修改bug一般新建分支,如果覺得可行,可以合併到master分支上. 二:建立方式      &nbs

    在fragment裡建立tab,viewpager(用一個fragment展示資料)

    ManiActivity中: package com.example.ssasas; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; import a

    oracle建立外來鍵約束的方式

    轉自:https://blog.csdn.net/baidu_37107022/article/details/74853467 1、建立表時直接建立外來鍵約束 create table books( bookid number(10) not null primary ke

    EasyUI建立DataGrid及凍結列的方式

       第一種方式:通過HTML標籤建立資料表格控制元件 <table class="easyui-datagrid" title="基本資料表格" style="width: 700px; height: 250px" data-optio

    spark建立DF的方式

    方式一:反射:(使用這種方式來建立DF是在你知道欄位具體有哪些) 1.建立一個SparkContext,然後再建立SQLContext 2.先建立RDD,對資料進行整理,然後關聯case class,將非結構化的資料轉換成結構化資料 3.顯示的呼叫toDF方法,將RDD轉換成DF(需要隱私轉

    java之執行緒建立方式,六狀態和匿名內部類建立子類或實現類物件

    一.匿名內部類建立子類或實現類物件 new Test(){} 相當於建立了Test類的子類物件 並且沒有類名 建立介面實現類 new 介面名() {};介面實現類的物件 注意 : new 後邊是類或者介面名 大括號內是類或者介面中的方法 public

    Java中建立和啟動執行緒的方式

    方式1:繼承Thread類 步驟: 1):定義一個類A繼承於java.lang.Thread類. 2):在A類中覆蓋Thread類中的run方法. 3):我們在run方法中編寫需要執行的操作:run方法裡的程式碼,執行緒執行體. 4):在main方法(執行緒)中,建

    SpringBoot學習筆記(二) SpringBoot專案建立方式

    叄念 springboot 專案建立方式其實有多種,這裡我們主要介紹兩種方式: 當然這裡建議大家用方式一來建立,方式二用於理解 方式

    建立Java多執行緒的方式和執行緒異常

    一.使用多執行緒的兩種方法  使用多執行緒的兩種方法有:繼承Thread類和實現runable介面。 二.繼承Thread類 來看一下thread類的原始碼:  class Thread implements Runnable { 首先可以看出thread類也是實現Runable介面的run方法如下: