注文

2016-03-27 13 views
-1

私は、次の注文

#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 

私のCファイルはクリックすると、次の

#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); 
} 

が含まれているが含まれているリソースファイル(.RC)を持っていますダイアログボックスがコールバック関数を繰り返し開いた後のラジオボタンは、同じメッセージを受信します。このメッセージは、LOWORD(wParam)== ID_RADIOBUTTON1のWM_COMMANDです。しかし、SendMessageがMessageBoxの前に呼び出された場合、エラーは発生しません。これには特別な理由はありますか?

EDIT


しかし、私はprintfのとメッセージボックスの呼び出しを置き換えるならば、エラーは発生しませんし、動作が期待されると、出力の単一インスタンスのみが生産されるようです。

私はgccとwindresを使ってプログラムを作っています。

私のOSは、これを自動的に選択マークを設定します(代わりにRADIOBUTTONの)のWindows Vista(TM)Home Premiumは、32ビットのサービスパック2

+1

あなたはセミコロンが欠落している – stackptr

+0

申し訳ありませんが...私はそれが – user2419083

+1

悪いそれをテストせずにマイル離れ半分から編集:BM_SETCHECKはBN_CLICK通知を生成します。これはWM_COMMAND通知でラップされます。 SendMessageコールを移動すると、UIスレッドで100%コアを焼くか、メッセージボックスでいっぱいの画面を取得するかを選択できます。ラジオボタン*がチェックされる必要があるときにBM_SETCHECKを送るだけでループを解除してください。そんな感じ。 –

答えて

0

使用AUTORADIOBUTTONです。例:あなたが選択は自分自身をマーク設定する必要がRADIOBUTTONについて

... 
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 

あなたはMessageBoxまたは他のモーダルウィンドウを使用することができます。できるだけ早くこれを行い、ただちにTRUEを返してください。前または後にMessageBoxを呼び出さないでください:

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

ps、Visual Studio 2015で記述しているのと同じエラーを複製できませんでした(私はいくつかのエラー/不正行為を複製しました)別のIDEを使用している可能性があります。 –

+0

しかし、MessageBoxを呼び出さない理由は何ですか?さらに詳しい情報については、私の編集を参照してください。 – user2419083

+0

私はVisual Studio 2008であなたのエラーを複製することができました-----あなたは '' AUTORADIOBUTTON "'を使うべきです、そして 'MessageBox'を使うことができます。問題はあなたが古い "RADIOBUTTON"を使っていることです。選択範囲の設定に応じて選択を設定していますが、これは簡単にループに陥ることがあります。 –