討論區快速選單
知識庫快速選單
掌握Salesforce雲端管理秘訣 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
請教 VC++ 動態新增 button 的問題
更改我的閱讀文章字型大小
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/3/9 下午 04:11:13
各位大大,不好意思,又來請教一些基本的問題

我從網路上查到,我可以用

CButton *newButton;

newButton->Create(_T("new Button"), WS_VISIBLE | BS_PUSHBUTTON , CRect( 10, 10, 100, 100), this, 0x11);

來動態建立,我的 newButton , 也定義了 buttonID 為 0x11

但是卻找不到,如何定義這個 newButton 被 Click 時產生的 event
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/3/9 下午 04:51:04
剛剛查了 msdn , 系統應該會送一個 WM_COMMAND 這個 MESSAGES ,

但是還看不太懂 , WM_COMMAND 這個 MESSAGES 要怎麼收,如何區別是那個 BUTTON 送來的 MESSAGES

也有說,系統也會送 KEY_FOCUS 這個 MESSAGES,

請教各位高手,標準應該用那個 function 收才是正確,
要如何收,

補充,我的系統是 win 8.1/ win 10 用的是 vs 2013 的 vc++

net framework 4.5
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/3/9 下午 05:19:20
目前找到的方式,是可以用 OnCommand 來收到訊息

OnCommand(WPARAM wParam, LPARAM lParam) {

}

其中

 wParam -〉就是我建立 button 時的 id, 當然 msnd 上的詳細說明,會把這個 word 分兩部分解釋

    The low-order word of wParam identifies the command ID of the menu item, control, or accelerator. The high-order word of wParam specifies the notification message if the message is from a control. if the message is from an accelerator, the high-order word is 1. if the message is from a menu, the high-order word is 0.

lParam -> 這個是 Button 的 m_hWnd 碼,用這個就可以取得 button的 state, 或是其他資料

    Identifies the control that sends the message if the message is from a control. Otherwise, lParam is 0

這是 msdn 上的說明

只是把我的程式加在這裡不知道對不對1

希望有高手給個建議
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/3/9 下午 10:06:18
你用 MFC? 最簡單的作法就是不要動態的創建控制項, 而是把控制項放在 dialog 裡, 然後用 hide/show 來控制.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kuolung註記此篇回應為很有道理 2016/3/10 上午 02:16:02
當然, 如果你有固定的或預留的 button ID, 你可以直接把你的 ON_BN_CLICK() 加入到 message map 裡面, 前提是: CButton 物件必須是你的 dialog class 的成員.
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/3/10 下午 04:16:10
可否請教

前提是-->前提是: CButton 物件必須是你的 dialog class 的成員

不太懂這個前提要如何做

我現在的做法是 在 dialog class 中只宣告 CButton 的 空指標


CButton *myButton[20]

然後再

Dialog 的 Init 中加入

 myButton[x] = new CButton;
 myButton[x]->Create......

我想請問的是,
如我寫了一個 function myButtonFunc(.....)

如何指定 myButton[x] 被 click 要執行 myButtonFunc

作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kuolung註記此篇回應為最佳解答 2016/3/14 上午 01:12:32
>前提是-->前提是: CButton 物件必須是你的 dialog class 的成員
>
>不太懂這個前提要如何做
>
>我現在的做法是 在 dialog class 中只宣告 CButton 的 空指標
>如
>
>CButton *myButton[20]

不需要用指標, 直接用物件就可以了:

class CMyDialog : public CDialog
{
...
CButton m_myButton[20];
};

指標的唯一用處就是: 指標可以是 nullptr, 用來標示某些物件不存在. 但這個有更多的替代方法.

所有 MFC 的視窗物件都是 2-stage creation: 先有 MFC 物件 (也就是 C++ 物件), 然後才創建視窗物件



>然後再
>
>Dialog 的 Init 中加入
>
> myButton[x] = new CButton;
> myButton[x]->Create......

BOOL CMyDialog::OnInitDialog()
{
  CDialog::OnInitDialog();
  m_myButotn[n].Create(...);
}

>我想請問的是,
>如我寫了一個 function myButtonFunc(.....)
>
>如何指定 myButton[x] 被 click 要執行 myButtonFunc

有很多方法, 但最簡單的就是 MFC 的 message map. 在你 dialog 的 .cpp 檔裡找出這幾行:
  BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
  ...
  END_MESSAGE_MAP()

在其中加入:
  ON_BN_CLICKED(MY_CREATED_BTN_ID1, myButtonFunc)

  ON_CONTROL_RANGE(BN_CLICKED, MY_FIRST_CREATED_BTN_ID, MY_LAST_CREATED_BTN_ID, myButtonsFunc)

前者的 myButtonFunc() 沒有參數. 如果使用後者, 要用 myButtonsFunc(Uint nID).

作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/3/14 下午 01:58:01
===========================
有很多方法, 但最簡單的就是 MFC 的 message map. 在你 dialog 的 .cpp 檔裡找出這幾行:
  BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
  ...
  END_MESSAGE_MAP()

在其中加入:
  ON_BN_CLICKED(MY_CREATED_BTN_ID1, myButtonFunc)

  ON_CONTROL_RANGE(BN_CLICKED, MY_FIRST_CREATED_BTN_ID, MY_LAST_CREATED_BTN_ID, myButtonsFunc)

前者的 myButtonFunc() 沒有參數. 如果使用後者, 要用 myButtonsFunc(Uint nID).
==============================

謝謝,了解了,大約知道如何寫了
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.15625