C言語とWin32APIを用いてVisual C++.netにてWindowsプログラミングをしています。

いま、表示用ウインドウと制御用のウインドウを1つずつつくりました。
このとき、制御用のウインドウを操作することによって表示用のウインドウを変化させたいのですが、
これに関する良いサンプルはありますでしょうか?

具体的には、制御用ウインドウで「ビットマップを開く」を選択すると、
ビットマップファイルを読み込み、表示用ウインドウに表示したいです。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2006/06/01 17:15:35
  • 終了:2006/06/02 11:08:01

回答(8件)

id:villain No.1

villain回答回数174ベストアンサー獲得回数122006/06/01 17:29:06

ポイント5pt

基本的にはHWNDとHDCさえ分かっていればあとはビットマップの

操作を応用すればできると思います。


猫でもわかるプログラミングさんのところでも参考にしてください。


具体的な解説でなくて、すみません。

id:kwa1210

具体的なサンプルが見てみたいです。

2006/06/01 17:40:12
id:ysskondo No.2

ysskondo回答回数56ベストアンサー獲得回数02006/06/01 17:41:12

ポイント3pt

 表示用ウインドウと制御用のウインドウが別アプリ(別のexeファイル)なら、

 WM_COPYDATAメッセージを制御ウインドウ側から表示ウインドウ側へSendMessage()でSendして、表示ウインドウ側を制御するのが簡単ですよ。

 もちろん、表示ウインドウ側のウインドウプロシージャには、WM_COPYDATAに対する応答ロジックを組み込む必要があります。

http://web.kyoto-inet.or.jp/people/ysskondo/chap8.html

id:kwa1210

ウインドウ表示だけでなく、実際に何か処理をしているサンプルはありませんでしょうか?

2006/06/01 17:50:33
id:ysskondo No.3

ysskondo回答回数56ベストアンサー獲得回数02006/06/01 17:56:44

ポイント3pt

>ウインドウ表示だけでなく、実際に何か処理をしている

>サンプルはありませんでしょうか?

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

#回答回数の上限を増やして欲しい。

#質問の意図が読み取れていないんです。

#すみません。

 



 

id:kwa1210

説明が下手で申し訳ありません。

2つのウインドウを利用しているサンプルプログラムを見てみたいのです。

2006/06/01 18:05:49
id:ysskondo No.4

ysskondo回答回数56ベストアンサー獲得回数02006/06/01 18:17:13

ポイント3pt

 すぐにサンプルなど書けないです。すみません。

 貴方様の質問には2つのポイントがあるんですよね。

 1つは、プロセス間通信。

 もう1つは、DIBの表示。

 プロセス間通信の場合、制御画面(制御アプリ?)は、以下の事をする必要があります。

・FindWindow()で表示アプリが起動されているか?起動されているならウインドウハンドルの値の取得・

・表示ウインドウへWM_COPYDATAでプロセスを越えてメッセージを送信する。

 こんど、表示画面(表示アプリ)は、WM_COPYDATAメッセージを受け取り、送られた数値の内容をチェックして、DIBを読み込み画面に表示する。

 DIB表示は、

 http://lcl.web5.jp/prog/ddbtest.html

 が詳しそうです。

id:kwa1210

すみません、質問文があまりよくありませんでしたね。

この質問は、DIBの表示よりもプロセス間の通信に関するサンプルが見たいという目的でした。

2006/06/01 19:23:24
id:redice No.5

redice回答回数15ベストアンサー獲得回数12006/06/02 00:14:28

ポイント5pt

ご質問は、俗に言う「MDI」アプリケーションを作成したいということでよろしいでしょうか?

それであれば、以下のページにWin32APIのサンプルソース付きで解説があります。


http://www.kumei.ne.jp/c_lang/sdk/sdk_83.htm

http://www.kumei.ne.jp/c_lang/sdk/sdk_84.htm

http://www.kumei.ne.jp/c_lang/sdk/sdk_85.htm

id:kwa1210

うーん、純粋なMDIとはちょっと違う感じですかね。

MDIだとしても、窓ごとのデータのやり取りのサンプルが見てみたいです。

2006/06/02 01:02:25
id:ysskondo No.6

ysskondo回答回数56ベストアンサー獲得回数02006/06/02 00:32:41

ポイント70pt

サンプルです

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;

}

id:kwa1210

そうそう、このようなデータのやりとりが見てみたかったのです。

わざわざサンプルを作成していただき、ありがとうございます。

2006/06/02 01:10:14
id:ysskondo No.7

ysskondo回答回数56ベストアンサー獲得回数02006/06/02 01:12:30

ポイント1pt

>そうそう、このようなデータのやりとりが見てみたかったのです。

>わざわざサンプルを作成していただき、ありがとうございます。

 疲れたわ(^^;)

id:kwa1210

ありがとうございました。

これと同じような動作をするもので、

表示用ウインドウと制御用のウインドウが別のアプリケーションじゃなくて、

ひとつのアプリケーションでウインドウを2つ開いてデータのやり取りをするようなサンプルとかってありますかね?

引き続き、回答を募集してみます。

2006/06/02 01:20:10
id:kazu1107 No.8

mzk回答回数199ベストアンサー獲得回数142006/06/02 06:23:49

ポイント70pt

作ってみました。

(ごめんなさい上のサンプルより作りが荒いかと)

http://digihills.sakura.ne.jp/blog/sample.lzh

動作概念は、コントロールウィンドウとビューウィンドウをWinMain内作り、コントロールウィンドウに張ってあるボタンを押せばビューウィンドウにメッセージがいき、送信確認用にメッセージウィンドウを表示する・・・というものです。

IDの番号の付け方とか、グローバル変数(二つのウィンドウのハンドル)を使ってるところとか、工夫すればもっとちゃんと出来ますけど、とりあえずサンプルなので手抜きです。

id:kwa1210

おぉ! 制御ウインドウのボタンを押したら、表示ウインドウでメッセージボックスの表示。まさにこれです!

非常にわかりやすいサンプルで参考になります。

本当にありがとうございました。

以上で回答を締め切らせていただきます。皆様、ありがとうございました。

2006/06/02 11:00:27

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません