建立選單;MAKEINTRESOURCE;選單加入視窗的兩種方式
MAKEINTRESOURCE是一個資源名轉換的巨集,這個巨集是把一個數字型別轉換成指標型別的巨集,它不存在釋放的問題。
選單加入視窗的兩種方式
第一種是類級別的,也就是我們在設計視窗類時,直接指定給WNDCLASS結構的lpszMenuName成員,這樣做意味著,在呼叫CreateWindow函式建立視窗時,無論你是否為視窗指定選單,最終顯示的視窗上都會有選單,因為它是基於整個視窗類的。
[cpp] view plain copy print?- // 在這裡把選單附加上,成為類級別
-
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN);//整個選單資源的ID,不是選單項
- HWND hm = CreateWindow(
- L"MainWd",
- L"我的應用程式",
- WS_OVERLAPPEDWINDOW,
- 25,
- 18,
- 380,
- 280,
- NULL,
- NULL,
- hthisInstance,
- NULL);
這樣在我們建立視窗時,哪怕你把hMenu引數設為NULL,最後顯示的視窗都會有選單,因為選單是屬於視窗類本身的。
另一種方式,就是不設定為類級別的選單,而是在呼叫CreateWindow時指定給hMenu引數。
[cpp] view plain copy print?- HWND hm = CreateWindow(
- L"MainWd",
- L"我的應用程式",
- WS_OVERLAPPEDWINDOW,
- 25,
- 18,
- 380,
- 280,
- NULL,
-
LoadMenu(hthisInstance,MAKEINTRESOURCE(IDR_MAIN)),
- hthisInstance,
- NULL);
同時我們把設計視窗類時設定選單的程式碼註釋掉。
[cpp] view plain copy print?- // 在這裡把選單附加上,成為類級別
- //wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN);//整個選單資源的ID,不是選單項
然後,我們執行這個程式,它還是有選單的。
方法一,用程式碼新增選單
這種方法的思路是:首先在全域性範圍內定義一個HMENU的變數,用來儲存視窗中選單欄的控制代碼,根選單(選單欄)可以CreateMenu函式來建立,接著可以使用AppendMenu函式或者InsertMenuItem函式來建立選單項。
控制代碼就是記憶體中各種資源的ID,比如圖示,圖片,字串等。我們的選單也是一種資源。
下面我寫了一個函式,用來動態建立選單。
[cpp] view plain copy print?- void CreateMyMenu()
- {
- hRoot = CreateMenu();
- if(!hRoot)
- return;
- HMENU pop1 = CreatePopupMenu();
- AppendMenu(hRoot,
- MF_POPUP,
- (UINT_PTR)pop1,
- L"操作");
- // 一種方法是使用AppendMenu函式
- AppendMenu(pop1,
- MF_STRING,
- IDM_OPT1,
- L"飛機");
- // 另一種方法是使用InsertMenuItem函式
- MENUITEMINFO mif;
- mif.cbSize = sizeof(MENUITEMINFO);
- mif.cch = 100;
- mif.dwItemData = NULL;
- mif.dwTypeData = L"機關槍";
- mif.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
- mif.fState = MFS_ENABLED;
- mif.fType = MIIM_STRING;
- mif.wID = IDM_OPT2;
- InsertMenuItem(pop1,IDM_OPT2,FALSE,&mif);
- }
hRoot是在外部定義的全域性變數,儲存選單欄的標識。完整的程式碼如下:
- #include <Windows.h>
- #define IDM_OPT1 301
- #define IDM_OPT2 302
- HMENU hRoot;
- void CreateMyMenu();//建立選單
- LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
- int CALLBACK WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR cmdLine,
- int nShow)
- {
- CreateMyMenu();//建立選單
- WCHAR* cn = L"Myapp";
- WNDCLASS wc={ };
- wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
- wc.lpszClassName = cn;
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.hInstance = hInstance;
- wc.lpfnWndProc = (WNDPROC)MyWinProce;
- RegisterClass(&wc);
- HWND hm = CreateWindow(cn,
- L"我的應用程式",
- WS_OVERLAPPEDWINDOW,
- 20,
- 15,
- 420,
- 360,
- NULL,
- hRoot,
- hInstance,
- NULL);
- if( hm == NULL )
- return 0;
- ShowWindow(hm,nShow);
- MSG msg;
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return 0;
- }
- LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
-
相關推薦
建立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方法如下: