原来用资源手动在对话框上创建了3个button
现在在 switch (message) { case WM_INITDIALOG:
pProjects = new Project;
strcpy(pProjects->szProjectName , "jian4");
pProjects->checkid =(int) ::CreateWindow("BUTTON",pProjects->szProjectName,WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON,80,80,100,100,hDlg,NULL,(HINSTANCE) GetWindowLong(hDlg, GWL_HINSTANCE),NULL); return true; case WM_CLOSE:
动态添加了一个button
但是这个button 不能点啊
其他的都可以用
怎么解决啊 ?

解决方案 »

  1.   

    我的代码是这样的 IDC_RADIO2 是手动添加的 可以响应消息 可以点 有效 可是 动态建立的那个就不可以
    这是什么原因啊 ?
    static BOOL SelectEditionMsg(HWND hDlg, UINT message, WPARAM wParam) {
    switch (message) {
    case WM_INITDIALOG:
    pProjects = new Project;
    strcpy(pProjects->szProjectName , "jian4");
    pProjects->checkid =(int) ::CreateWindow("BUTTON",pProjects->szProjectName,WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON,80,80,100,100,hDlg,NULL,hInst,NULL); return true; case WM_CLOSE:
    ::SendMessage(hDlg, WM_COMMAND, IDCANCEL, 0);
    break;
    case WM_COMMAND:
    if ((wParam & 0xffff) == IDOK) {
    if(::IsDlgButtonChecked(hDlg,pProjects->checkid))
    {
    int i = 100;
    }
    if (::IsDlgButtonChecked(hDlg,IDC_RADIO3))
    {
    strEditor = "j";
    }
    else if(::IsDlgButtonChecked(hDlg,IDC_RADIO2))
    {
    strEditor = "j";
    }
    else 
    strEditor = "; ::EndDialog(hDlg, IDOK); return TRUE;
    } else if ((wParam & 0xffff) == IDCANCEL) {
    ::EndDialog(hDlg, IDCANCEL); return FALSE;
    }
    } return FALSE;
    }BOOL CALLBACK SelectEditionDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { return SelectEditionMsg(hDlg, message, wParam);
    }
    static int C_SelectEdition(lua_State *L)
    {
    ::DialogBoxParam((HINSTANCE)host->GetInstance(), (LPCSTR)MAKEINTRESOURCE(IDD_SELECT_EDITION), (HWND)host->GetMainWnd(),
    reinterpret_cast<DLGPROC>(SelectEditionDlg), reinterpret_cast<sptr_t>(host));
    return 0;
    }
      

  2.   

    动态创建的 不是响应wm_command消息吗?
      

  3.   

    S_RADIOBUTTON,80,80,100,100,hDlg,(HMENU)IDC_XXX,hInst,NULL); 似乎要指定ID。
      

  4.   

    这里可以用CreateWindow么?没这么用过,说一下自己的想法。这样的话创建一个窗口,有自己的消息处理函数,你不控制的话不会给主窗口发送on_command消息吧?可以试一下申请一个新CButton类,然后把窗口attach给他,然后给他设个ID。。用CButton.create不可以么?实在不行CreateCtronl也可以啊,不过还得自己attach窗口.
      

  5.   

    楼主,你没有写响应消息,就用BS_AUTORADIOBUTTON样式吧,至少保证是可以点击的。pProjects->checkid =(int) ::CreateWindow("BUTTON",pProjects->szProjectName,WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON,80,80,100,100,hDlg,NULL,(HINSTANCE) GetWindowLong(hDlg, GWL_HINSTANCE),NULL);
      

  6.   

    1。要想使单选按钮能被选中,需要指定风格 BS_AUTORADIOBUTTON
    2.要想按钮能响应WM_COMMAND消息,需要在CreateWindow函数中倒数第三个参数指定为按钮的ID
    示例代码:
    #define ID_RADIO 100
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
        static HWND hRadio,hRadio1;
    switch (message)
    {
    case WM_CREATE:
    hRadio=CreateWindow(_T("Button"),_T("RADIO"),WS_CHILD|WS_VISIBLE|WS_BORDER|BS_AUTORADIOBUTTON,50,50,200,30,hWnd,(HMENU)ID_RADIO,hInst,NULL);
    hRadio1=CreateWindow(_T("Button"),_T("RADIO"),WS_CHILD|WS_VISIBLE|WS_BORDER|BS_AUTORADIOBUTTON,50,100,200,30,hWnd,(HMENU)200,hInst,NULL);
    break;
    case WM_COMMAND:
    if(LOWORD(wParam)==ID_RADIO)
    {
    if(::IsDlgButtonChecked(hWnd,ID_RADIO))
    {
    MessageBox(NULL,_T("单选按钮选中"),_T("消息"),MB_OK); }
    }
              break;
                default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
    你的这段代码:
    case WM_COMMAND: 
    if ((wParam & 0xffff) == IDOK) { 
    表明了只有当OK按钮被单击时,你才会接受到WM_COMMAND消息,因此当动态添加的按钮被单击时,没有任何实际的代码被执行到