VC實現自定義控制項步驟

2021-09-23 14:09:07 字數 2134 閱讀 7893

一. 控制項的最小實現

1.1 新增mfc類cmyctrl

新增mfc類cmyctrl, 繼承cwnd.(用嚮導新增, 自己手動寫**都可以).

1.2 新增cmyctrl::registerwindowclass函式

新增和實現cmyctrl::registerwindowclass函式(函式名隨便), 該函式在建構函式中呼叫即可.

1.3 新增cmyctrl::create函式

函式名隨便, 引數如下

int cmyctrl::create(cwnd *pparentwnd, const rect &rect, uint nid, dword dwstyle);

1.4 其他

前面三步就可以完成乙個基本的控制項的搭建, 而一般自定義控制項就是為了重繪, 滑鼠操作之類的, 新增這些功能就是過載cwnd對應的虛函式, 新增相關的訊息處理函式就可以了.

類**如下

// myctrl.h#pragma once// cmyctrl#define myctrl_name _t("myctrl")class cmyctrl : public cwnd;  / myctrl.cpp//#include "stdafx.h"#include "myctrl.h"// cmyctrl// 有這個才支援動態建立implement_dynamic(cmyctrl, cwnd) cmyctrl::cmyctrl(){} cmyctrl::~cmyctrl(){}  begin_message_map(cmyctrl, cwnd)end_message_map() // cctrl 訊息處理程式// 註冊類函式bool cmyctrl::registerwindowclass()    }    return true;} int cmyctrl::create(cwnd *pparentwnd, const rect &rect, uint nid, dword dwstyle)

二. 使用

這裡以對話方塊為例

2.1 使用custom control資源自動繫結

1. 把這個控制項拖到對話方塊資源上(大小/位置自己調).

2. 右鍵控制項, 調到屬性介面, 修改如下:

其中class選項的內容要與myctrl_name相同(看cmyctrl中myctrl_name的定義);

id選項隨便填, 不重複即可.

3. 繫結idc_custom_ctrl與cmyctrl物件.(手動新增/嚮導新增都可以, 你懂得)

// **件宣告cctrl m_ctrl;// cpp檔案中**void ctestctrldlg::dodataexchange(cdataexchange* pdx)

4. 可以執行了. 

繫結custom control的方法使用上比較簡單, 呼叫**少.

2.2 使用custom control資源自動繫結

1. 和2.1步驟1一樣.

2. 和2.1步驟2一樣.

3. 不使用ddx_control(pdx, idc_custom_ctrl, m_ctrl); 而是在cdlg::oninitdialog中使用m_ctrl3.subclassdlgitem(idc_custom_ctrl, this);

4. 可以執行了.

這樣子也很簡單.

2.3 手動建立

1. 手動建立

只要宣告 cctrl物件, 然後呼叫cctrl::create函式就可以了, 但是要注意的是create函式的引數必須要正確.

2. create函式的引數

看這裡的**:

// **件  cctrl m_ctrl;     // cdlg::oninitdialog  crect rect;  getdlgitem(idc_static_custom)->getwindowrect(rect);  screentoclient(rect);getdlgitem(idc_static_custom)->showwindow(sw_hide);    // 這裡最好隱藏一下, 否則會蓋掉自定義控制項 m_ctrl2.create(this, rect,12345, ws_visible);  

其中idc_static_custom 我的是picture control, 你也可以使用static text

3. 可以執行了

該方法更簡單, 而且可以動態建立, 但是構造create函式的引數比較複雜.

原文: 

自定義控制項步驟

1.自定義乙個組合控制項 定義乙個累 繼承 linearlayout relativelayout 2.重寫構造方法 兩個引數的構造方法 在定義xml布局檔案的時候 回去呼叫這個構造方法 3.在構造方法裡面 view.inflate context,r.layout.ui setting view,...

vc 自定義訊息實現

本案例是根據兩個dialog 相互通訊總結而來,在兩個dialog都設定好後,分為四步實現訊息傳遞 專案名稱為 mfcmiltiwin 主dialog cmfcmiltiwindlg 從dialog cdialogsub 1 定義訊息id 在專案的標頭檔案中 mfcmiltiwin.h 巨集定義兩個...

DuiLib實現自定義控制項

在duilib中實現自定義控制項,和qt過載類似,也是繼承原有的控制項只不過是要將這個控制項也能在xml中進行使用。當作xml中的乙個節點。下面就看一下我寫的乙個小例子,這個例子是過載了乙個按鈕 cbuttonui 過載cbuttonui的標頭檔案 subcontrol.h ifndef subco...