いま、表示用ウインドウと制御用のウインドウを1つずつつくりました。
このとき、制御用のウインドウを操作することによって表示用のウインドウを変化させたいのですが、
これに関する良いサンプルはありますでしょうか?
具体的には、制御用ウインドウで「ビットマップを開く」を選択すると、
ビットマップファイルを読み込み、表示用ウインドウに表示したいです。
よろしくお願いします。
基本的にはHWNDとHDCさえ分かっていればあとはビットマップの
操作を応用すればできると思います。
猫でもわかるプログラミングさんのところでも参考にしてください。
具体的な解説でなくて、すみません。
表示用ウインドウと制御用のウインドウが別アプリ(別のexeファイル)なら、
WM_COPYDATAメッセージを制御ウインドウ側から表示ウインドウ側へSendMessage()でSendして、表示ウインドウ側を制御するのが簡単ですよ。
もちろん、表示ウインドウ側のウインドウプロシージャには、WM_COPYDATAに対する応答ロジックを組み込む必要があります。
ウインドウ表示だけでなく、実際に何か処理をしているサンプルはありませんでしょうか?
>ウインドウ表示だけでなく、実際に何か処理をしている
>サンプルはありませんでしょうか?
http://web.kyoto-inet.or.jp/people/ysskondo/chap5.html
http://web.kyoto-inet.or.jp/people/ysskondo/from36/chap38.html
http://web.kyoto-inet.or.jp/people/ysskondo/from36/chap39.html
http://web.kyoto-inet.or.jp/people/ysskondo/from36/chap40.html
#回答回数の上限を増やして欲しい。
#質問の意図が読み取れていないんです。
#すみません。
説明が下手で申し訳ありません。
2つのウインドウを利用しているサンプルプログラムを見てみたいのです。
すぐにサンプルなど書けないです。すみません。
貴方様の質問には2つのポイントがあるんですよね。
1つは、プロセス間通信。
もう1つは、DIBの表示。
プロセス間通信の場合、制御画面(制御アプリ?)は、以下の事をする必要があります。
・FindWindow()で表示アプリが起動されているか?起動されているならウインドウハンドルの値の取得・
・表示ウインドウへWM_COPYDATAでプロセスを越えてメッセージを送信する。
こんど、表示画面(表示アプリ)は、WM_COPYDATAメッセージを受け取り、送られた数値の内容をチェックして、DIBを読み込み画面に表示する。
DIB表示は、
http://lcl.web5.jp/prog/ddbtest.html
が詳しそうです。
すみません、質問文があまりよくありませんでしたね。
この質問は、DIBの表示よりもプロセス間の通信に関するサンプルが見たいという目的でした。
ご質問は、俗に言う「MDI」アプリケーションを作成したいということでよろしいでしょうか?
それであれば、以下のページにWin32APIのサンプルソース付きで解説があります。
http://www.kumei.ne.jp/c_lang/sdk/sdk_83.htm
うーん、純粋なMDIとはちょっと違う感じですかね。
MDIだとしても、窓ごとのデータのやり取りのサンプルが見てみたいです。
サンプルです
http://image-data.no-ip.info/temp/sample.lzh
にリソースファイルも実行ファイルも全部入っていますよ。
自宅webサーバーですので、ルーターが死んでいる場合があります。
死んでいたら、数時間待ってね。復旧しますからね。。。。
VC5Pro(SP3)で作成しました。
-------------------->
/* 制御側 */
#define STRICT
#include <windows.h>
#include "resource.h"
/* メインウインドウとなるダイアログボックスのダイアログプロシージャのプロトタイプ宣言 */
extern BOOL CALLBACK MainWindowProc(HWND,UINT,WPARAM,LPARAM);
/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
/* ここでメインウインドウを開ける */
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainWindowProc);
return 0;
}
/* メインウインドウとなるダイアログボックスのダイアログプロシージャ */
BOOL CALLBACK MainWindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
HWND hw;
COPYDATASTRUCT cs;
switch(msg)
{
/* ダイアログボックス初期化 */
case WM_INITDIALOG:
return FALSE;
case WM_CLOSE:
EndDialog(hwnd,0);
return TRUE;
case WM_COMMAND:
hw=FindWindow(NULL,"表示側");
if(hw!=NULL)
{
cs.dwData=0;
cs.cbData=0;
cs.lpData=NULL;
SendMessage(hw,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)&cs);
}
return TRUE;
}
return FALSE;
}
-------------------->
/* 表示側 */
#define STRICT
#include <windows.h>
#include "resource.h"
/* メインウインドウとなるダイアログボックスのダイアログプロシージャのプロトタイプ宣言 */
extern BOOL CALLBACK MainWindowProc(HWND,UINT,WPARAM,LPARAM);
/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
/* ここでメインウインドウを開ける */
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainWindowProc);
return 0;
}
/* メインウインドウとなるダイアログボックスのダイアログプロシージャ */
BOOL CALLBACK MainWindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
switch(msg)
{
/* ダイアログボックス初期化 */
case WM_INITDIALOG:
return FALSE;
case WM_CLOSE:
EndDialog(hwnd,0);
return TRUE;
case WM_COPYDATA:
SendDlgItemMessage(hwnd,IDC_LIST2,LB_ADDSTRING,0,(LPARAM)"近藤妥です");
return TRUE;
}
return FALSE;
}
そうそう、このようなデータのやりとりが見てみたかったのです。
わざわざサンプルを作成していただき、ありがとうございます。
>そうそう、このようなデータのやりとりが見てみたかったのです。
>わざわざサンプルを作成していただき、ありがとうございます。
疲れたわ(^^;)
ありがとうございました。
これと同じような動作をするもので、
表示用ウインドウと制御用のウインドウが別のアプリケーションじゃなくて、
ひとつのアプリケーションでウインドウを2つ開いてデータのやり取りをするようなサンプルとかってありますかね?
引き続き、回答を募集してみます。
作ってみました。
(ごめんなさい上のサンプルより作りが荒いかと)
http://digihills.sakura.ne.jp/blog/sample.lzh
動作概念は、コントロールウィンドウとビューウィンドウをWinMain内作り、コントロールウィンドウに張ってあるボタンを押せばビューウィンドウにメッセージがいき、送信確認用にメッセージウィンドウを表示する・・・というものです。
IDの番号の付け方とか、グローバル変数(二つのウィンドウのハンドル)を使ってるところとか、工夫すればもっとちゃんと出来ますけど、とりあえずサンプルなので手抜きです。
おぉ! 制御ウインドウのボタンを押したら、表示ウインドウでメッセージボックスの表示。まさにこれです!
非常にわかりやすいサンプルで参考になります。
本当にありがとうございました。
以上で回答を締め切らせていただきます。皆様、ありがとうございました。
具体的なサンプルが見てみたいです。