2016-03-27 31 views
-1

aynı mesaj almak için (Rc) aşağıdakial bir kaynak dosyası var

#include <windows.h> 
#include "resource.h" 

IDD_ABOUT DIALOG DISCARDABLE 0, 0, 500, 106 
BEGIN 

    DEFPUSHBUTTON "&OK", IDOK,   174, 18, 50, 14 

    RADIOBUTTON  "Radio 1", ID_RADIOBUTTON1, 226, 18, 55, 14 
END 

Benim C dosyası tıkladıktan sonra aşağıdaki

#include <windows.h> 
#include "resource.h" 

BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(Message) 
    { 
     case WM_COMMAND: 
     switch(LOWORD(wParam)) 
     { 
      case ID_RADIOBUTTON1: 
      { 
       MessageBox(hwnd, "RadioButton 1", "111", MB_OK); 
       SendMessage((HWND)lParam, (UINT) BM_SETCHECK, (WPARAM) BST_CHECKED,(LPARAM)NULL); 
      } 
     return TRUE; 
     break; 

     } 
    break; 
     default: 
      return FALSE; 
    } 
     return TRUE; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), NULL, AboutDlgProc); 
} 

içeriyor içeren Diyalog kutusunun açılmasından sonra radyo butonu bir kez daha geri arama fonksiyonu tekrar tekrar aynı mesajı alır ve bu mesaj bir WM_COMMAND olan LOWORD (wParam) == ID_RADIOBUTTON1 ile aynı olur. Ancak SendMessage MessageBox'tan önce çağrılırsa, hata gerçekleşmez. Bunun belirli bir nedeni var mı?

DÜZENLEME


Ama printf ile messageBox çağrıyı yerine o zaman hata olmaz ve beklenen davranıştır ve çıkış yalnızca tek bir örneğini üretilir gibidir.

Programı yapmak için gcc ve windres kullanıyorum.

Benim OS Bu otomatik seçim işareti ayarlayacaktır (yerine RADIOBUTTON arasında) Windows Vista (tm) Home Premium 32 bit Service Pack 2

+1

Sen noktalı virgül kaçırdığınızı – stackptr

+0

Maalesef ... Ben onu test etmeden kötü – user2419083

+1

yarım itibaren bir mil öteden düzenlendi: BM_SETCHECK bir BN_CLICK uyarı üretecektir. Hangi WM_COMMAND bildirimi ile sarılır. Bu nedenle SendMessage çağrısının hareket ettirilmesi, UI iş parçacığındaki% 100 özün yanması veya ileti kutularıyla dolu bir ekranın açılması arasında seçim yapmanızı sağlar. Telsiz butonunun * kontrol edilmesi gerektiğinde sadece BM_SETCHECK'i göndererek döngüyü kesin. Bunun gibi bir şey. –

cevap

0

kullanın AUTORADIOBUTTON olduğunu. Örneğin: Seçim kendini işaretlemek ayarlamak zorunda RADIOBUTTON için

... 
case ID_RADIOBUTTON1: 
{ 
    MessageBox... 
} 

:

IDD_ABOUT DIALOGEX 0, 0, 222, 257 
STYLE DS_ABSALIGN | DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU 
CAPTION "Dialog" 
FONT 9, "Segoe UI", 400, 0, 0x0 
BEGIN 
    DEFPUSHBUTTON "&OK", IDOK, 174, 18, 50, 14 
    AUTORADIOBUTTON "Radio 1", ID_RADIOBUTTON1, 226, 18, 55, 14 
END 

Sen MessageBox veya diğer modal pencereleri kullanabilirsiniz. Bunu en kısa zamanda yapın ve TRUE'u hemen geri gönderin. önce veya sonra MessageBox deme:

case ID_RADIOBUTTON1: 
    SendMessage((HWND)lParam, BM_SETCHECK, !IsDlgButtonChecked(hwnd, ID_RADIOBUTTON1), 0); 
    return TRUE; 
+0

ps, ​​Visual Studio 2015'te Tanımladığınız aynı hataları kopyalayamadım (bazı hataları/yanlış davranışları kopyaladım) Belki de farklı bir IDE kullanıyorsunuzdur. –

+0

Ancak neden MessageBox'ı aramıyoruz, bunu yapmamak için belirli bir neden var mı? Ayrıca daha fazla bilgi için lütfen sorularımdaki düzenlememe bakın. – user2419083

+0

Hatanızı Visual Studio 2008'de kopyalayabildim ----- "AUTORADIOBUTTON" öğesini kullanmalısınız, sonra bir 'MessageBox' kullanabilirsiniz. Sorun, eski olan "" RADIOBUTTON "' u kullanmanızdır. Seçimi ayarlamaya göre seçimi ayarlıyorsunuz, bu kolayca bir döngüde sıkışabilir. –