MFCはAfxBeginThreadでMFCスレッドの使用に基づいて、非モーダルダイアログボックス、非モーダルダイアログを確立する複数のスレッドを作成するために、サブスレッドでウィンドウ(のPostMessageメソッド)を作成します

1、子スレッドを作成

C ++のスレッドを作成するには、より多くの方法です

1)最も使いやすい<スレッド>ヘッダ・ファイルが、メインスレッドへのPostMessageメッセージをすることはできません。この方法で作成された子スレッドは、(I)は短いでは、成功しなかった、ミスを犯したかもしれません

三つの方法2)3)4)を参照してくださいVCのスレッドの作成https://blog.csdn.net/u014568921/article/details/44262645

3およびMFCなどの繁殖プログラムのルックスで4私はAfxBeginThreadの下にいくつかの試みを費やし、動作しません()メソッドは成功しています

ボイドCMFCDLLTestDlg :: OnBnClickedMessage()
{ 
    // TODO:この添加コントロール通知ハンドラコードで
     // スタートスレッドはWebSocketの 
    AfxBeginThread((AFX_THREADPROC)MsgThread、(VOID *)この、THREAD_PRIORITY_NORMAL、00 、NULLを); 
}

ここで私は、ボタンのクリックイベントにあったが、スレッド用WebSocketを開始し、世界的なスレッド機能MsgThread()

2、窓からカスタムメッセージを作成します

MFCプログラムでは、と呼ばれる直接の子スレッドの作成()メソッドは、サブスレッドの作成プロセスのようなサイクルのルックスを遮断する、非モーダルウィンドウを作成することはできません、メソッドを作成するために、メインスレッドに通知するカスタムメッセージを使用する必要があります

2.1カスタムメッセージ

MFCのカスタムメッセージは、3つのステップでは、難しいことではありません

図1に示すように、メッセージIDを定義します

私のプログラムは、そのように定義されMFCDLLTestDlg.cppメッセージIDで、MFCDLLTestDlgと呼ばれます

#define TEST_SENDMSG 200はWM_USER +である// メッセージIDへ

図2に示すように、メッセージハンドラの定義

メッセージ処理機能は受信ハンドルカスタムメッセージに使用されている、これもOK、クラスウィザードカスタムメッセージ処理や自身の手書きで追加することができる2つの方法があります第三のセーブクラスウィザードを使用して直接結合することができますが、ステップ

クラスウィザードモード:クラスへの切り替えを試みる---> ---クラスウィザード> [メッセージ--->カスタムメッセージを追加して、カスタムの入力メッセージIDと関数名のように

 クラス手書きのようにウィザードと、とにかく、彼らのメッセージIDが定義されている必要があり、固定数WM_USER +は、ライン上で繰り返されることはありません

そして、ヘッダファイルには、メインダイアログクラスで書かれたメッセージハンドラノートを宣言します

AFX_MSG LRESULT OnTestSendmsg(WPARAMのwParam、LPARAM lParamに)。

その後、CPPを定義します

LRESULT CMFCDLLTestDlg :: OnTestSendmsg(WPARAMのwParam、LPARAM lParamに)
{ 
    スイッチ(wParamに)
    { 
    ケースTEST_SENDMSG:
        CMsgWindow * p_MsgWindow = 新しいCMsgWindow()。
        p_MsgWindow - > SetSkin(MAKEINTRESOURCE(IDB_BITMAP1));
        // p_MsgWindow-> SetSkin(MAKEINTRESOURCE(IDB_BITMAP2));
        // p_MsgWindow-> SetSkin(MAKEINTRESOURCE(IDB_BITMAP3)); 

        CSTRING * CMSG =(のCString * )lParamにします。

        もし(!p_MsgWindow->作成(m_hWndを、_T(" 通知" )))
        { 
            AfxMessageBox(L "!失敗作成"); リターンを - 。1 ; 
        } 
        p_MsgWindow - > SetMsg(L " 模倣QQ右下ニュースポップ"CMSG *、L " http://blog.csdn.net/jackystudio " ); 
        p_MsgWindow - > ショー();
         BREAK ; 
    } 

    戻りLRESULT(); 
}

ここで私は、メッセージウィンドウを受信した後、持っていた爆弾にあったこの訪問について興味  http://blog.csdn.net/jackystudio  ブログ、私はここに美しいポッププログラムを見つけます

二つのパラメータのこの機能はそのノート[WPARAMのwParam、LPARAM lParamに]、これは、それらのタイプに変換することができ、最初のパラメータは、メッセージ・タイプであるように使用することができる、2番目のパラメータは文字列、整数、および他のパラメータでありますここでの文字列があるのCString

これら2つのパラメータはのPostMessage関数に渡され、以下を参照してください

3、メッセージハンドラマッピングを追加

メッセージIDと処理機能だけでなく、2個の関連付けられている、メッセージマップは、メインカテゴリで動作させ、見出さMESSAGE_MAPを

BEGIN_MESSAGE_MAP(CMFCDLLTestDlg、CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_WIN_TEXT、 CMFCDLLTestDlg :: OnBnClickedWinText)
    ON_BN_CLICKED(IDC_NEW_DLG、 CMFCDLLTestDlg :: OnBnClickedNewDlg)
    ON_BN_CLICKED(IDC_MESSAGE、 CMFCDLLTestDlg :: OnBnClickedMessage)ON_MESSAGE(TEST_SENDMSG、 

    CMFCDLLTestDlg :: OnTestSendmsg) 
END_MESSAGE_MAP()

あなたは、システムメッセージおよびマッピングボタンのクリックイベントはここにある外観はメッセージマップのメインクラスであることに注意してください見ることができます  BEGIN_MESSAGE_MAP(CMFCDLLTestDlg、CDialogEx)を、私は最初のクラスについての内側に書きました

2.2メッセージを送ります

娘スレッド関数でのPostMessageはメッセージを送信し、これは一般的に使用されている、のSendMessageライン、同期、非同期

// 他の論理スレッド機能を省略
 // ...
 // 送信メッセージを 
::のPostMessage(AfxGetMainWnd() - > GetSafeHwnd()、TEST_SENDMSG、(WPARAM)TEST_SENDMSG、(LPARAM)CMSG)。

のPostMessage機能追加に注意すべきスコープ修飾子をそれ以外の機能は、いくつかの異なる呼び出し元のメソッドを持って、

最初のパラメータがメインウィンドウへのハンドルであり、2つ目のパラメータは、メッセージID、上記の4つのパラメータのメッセージ・ハンドラに対応する第3の2つのパラメータであります

実行されたときにメッセージ機能を送信した後、メインスレッドは、メッセージウィンドウ、ウィンドウ関数を作成するプロセスを受けます

もちろん、限り、変更のためのメッセージIDとパラメータとして、例えば、ボタンのクリックイベントIDまたはメッセージIDシステムに置き換え、あなたは他のことを行うことができます  

3、参照記事

AfxBeginThread(コード例)C ++その8 MFCでを使用します

AfxBeginThreadでMFCを使用して複数のスレッドを作成します

非モーダルダイアログスレッドの確立と非モーダルダイアログの確立

MFCのSendMessage()関数は、文字列が渡されます

おすすめ

転載: www.cnblogs.com/jixiaohua/p/12117147.html