モードレスダイアログにアイコンを貼り付けたい

[戻る]
ちゅーちゅー 2003/02/03(月) 18:31:41
はじめまして
アイコンの張り付きができません。
例えば以下のようにモードレスダイアログを表示させるとして
そのダイアログにストップアイコンをつけようとしています。
いろいろ教えていただいているのですができません。

BOOL CDialogDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
・・・

ここにストップアイコンを貼り付ける処理をするのですか?

m_MessDlg = new CMESSDLG(this);
m_MessDlg->Create(IDD_MESS, this);
m_MessDlg->ShowWindow(SW_SHOW);
m_MessDlg->UpdateWindow();
・・・・・・・・・・

PAI 2003/02/03(月) 18:55:42
手元にあったコードそのまま貼り付けてみる。

((CStatic*)GetDlgItem(IDC_ICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_EXCLAMATION)));

ダイアログエディタのほうでIDC_ICONっていうピクチャーをはってある。

// 環境は一応ちゃんと書いときましょうね。

sugar 2003/02/03(月) 19:01:55
CMESSDLGがメッセージのダイアログですよね?
CMESSDLG::OnInitDialog()でアイコン設定するのが自然なのではないでしょうか?

ちゅーちゅー 2003/02/04(火) 12:27:05
PAIさんsugar さんありがとうございます。
確認なんですが
((CStatic*)GetDlgItem(IDC_ICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_EXCLAMATION)));
上記のソースで
IDC_ICONはピクチャーコントロールのID
IDI_EXCLAMATIONは貼り付けたいアイコンIDですか?
あとたくさん貼り付けたいダイアログボックスがあれば上記の
ソースを書いていけばいいんですね!CMESSDLG::OnInitDialog()のところで。。。

遅れましたが環境はWINDOWS2000.VC++.NETです。

ちゅーちゅー 2003/02/04(火) 12:32:55
たびたびすみません。あと作成したダイアログにピクチャーコントロール
を作成してそのプロパティのTypeでアイコンと指定してあげればいいんですか?

PAI 2003/02/04(火) 13:38:25
> 上記のソースで
> IDC_ICONはピクチャーコントロールのID
> IDI_EXCLAMATIONは貼り付けたいアイコンIDですか?
> あとたくさん貼り付けたいダイアログボックスがあれば上記の
> ソースを書いていけばいいんですね!CMESSDLG::OnInitDialog()のところで。

そうです。::LoadIcon() を調べてみてください。
多分、IDI_HAND か IDI_WARNING がお望みのアイコンでしょう。

で、たくさん貼るなら私の書いたソースはちょっとワンライナーでみづらいので
整形したあげた方がいいと思います。


> たびたびすみません。あと作成したダイアログにピクチャーコントロール
> を作成してそのプロパティのTypeでアイコンと指定してあげればいいんですか?

です。アイコンになってないと、何もいわずに失敗するみたいです。

// にしても.Netのリソースエディタは使いづらい・・・

dairygoods 2003/02/04(火) 15:06:46
アイコンが固定であるなら、
リソースエディタ上でピクチャーのプロパティを開いて、
 タイプ:アイコン
 イメージ:32513
などとしたほうが簡単かと思います。

ちなみに、
#define IDI_HAND 32513

ちゅーちゅー 2003/02/04(火) 15:27:37
うーん、張り付かないです。
((CStatic*)GetDlgItem(IDC_STATIC))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_WARNING)));
デバックは通るのですが・・・・。
他に必要なことがあるのでしょうか?
プロパティとかで。。。。、聞いてばかりすみません。
自分でもいろいろ調べてみますが。

// にしても.Netのリソースエディタは使いづらい・・・
同感です!!!!

PAI 2003/02/04(火) 16:09:00
IDC_STATICはコード側からアクセスできねぇッス。
なんかユニークなものに変えてあげてください。

// って、ここら辺の説明ヘルプに見当たらないのだが・・・

それでもできなかったら、dairygoodsさんのおっしゃってる方法で。

dairygoodsさん、プロパティに直接IDかけるんですね。
次の機会にはそうすることにします。

ちゅーちゅー 2003/02/04(火) 18:40:03
ありがとうございました。
下記の件の疑問点としてアイコンのIDがWINDOWSで定められているのなら
わざわざ#define IDI_HAND 32513する必要があるのですか?

>アイコンが固定であるなら、
>リソースエディタ上でピクチャーのプロパティを開いて、
> タイプ:アイコン
> イメージ:32513
>などとしたほうが簡単かと思います。

>ちなみに、
>#define IDI_HAND 32513

ちゅーちゅー 2003/02/04(火) 20:52:24
以下のようにアイコン表示を行うとエラーが出てしまいます。
またヘッダーでIDI_QUESTION、IDI_HAND、IDI_INFORMATIONをデファイン定義をすると
再定義だと警告を受けます。
指導願います。    
((CStatic*)GetDlgItem(IDC_ENDICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_QUESTION)));    //終了確認
((CStatic*)GetDlgItem(IDC_SQICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_QUESTION)));    //再送確認
((CStatic*)GetDlgItem(IDC_SIFICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_QUESTION)));    //再送確認
((CStatic*)GetDlgItem(IDC_MESSICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_HAND)));    //応答無終了
((CStatic*)GetDlgItem(IDC_NOCONTICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_INFORMATION)));//応答無
((CStatic*)GetDlgItem(IDC_NOSTOPICON))-> SetIcon( LoadIcon(NULL,MAKEINTRESOURCE
(IDI_INFORMATION)));//応答待ち

PAI 2003/02/04(火) 21:07:50
まず、IDI_INFORMATIONとかは自分で定義せんでええです。
(再定義ってことは既にあるってことで・・・)
dairygoodsさんは『こうなってるよ』っていう意味で
>#define IDI_HAND 32513
とかかれたんだと思います。

で、エラーって具体的に何でしょう? 
ひとつだけでも出来ませんか?


これは余談ですけど、ちょっとソースが正直すぎです。
// 私のアレはひとつだけだったからで・・・ってよくない見本です。

HICON hQuestion = LoadIcon(NULL,MAKEINTRESOURCE(IDI_QUESTION));
HICON hHand     = LoadIcon(NULL,MAKEINTRESOURCE(IDI_HAND));
HICON hInfo     = LoadIcon(NULL,MAKEINTRESOURCE(IDI_INFORMATION));

CStatic *pWnd;
VERIFY( pWnd = GetDlgItem(IDC_SQICON) );        pWnd->SetIcon( hQuestion );
VERIFY( pWnd = GetDlgItem(IDC_SIFICON) );       pWnd->SetIcon( hQuestion );
VERIFY( pWnd = GetDlgItem(IDC_MESSICON) );      pWnd->SetIcon( hHand );
VERIFY( pWnd = GetDlgItem(IDC_NOCONTICON) );    pWnd->SetIcon( hInfo );
VERIFY( pWnd = GetDlgItem(IDC_NOSTOPICON) );    pWnd->SetIcon( hInfo );

こんな感じですか?

PAI 2003/02/04(火) 21:18:13
>CStatic *pWnd;
>VERIFY( pWnd = GetDlgItem(IDC_SQICON) );        pWnd->SetIcon( hQuestion );

だめじゃん。GetDlgItem() は戻り値 CWnd* だからキャストは
いずれにしろしてやんなきゃ。

なかなかきれいには書きづらいな。

ちゅーちゅー 2003/02/05(水) 08:52:59
[[解決]]
そうでしたね。ちゃんとできました。ありがとうございました。
また何かあればお願いいたします。お世話になりました。

dairygoods 2003/02/05(水) 10:17:18
>dairygoodsさんは『こうなってるよ』っていう意味で
>>#define IDI_HAND 32513
>とかかれたんだと思います。

フォローどうもですm(_ _)m


私なら同じ処理が2つくらい出てきたら関数にしちゃいます。

inline void CxDlg::SetDlgStaticIcon(UINT id, HICON icon) 
{
  ((CStatic*)GetDlgItem(id))->SetIcon(icon);
}
とか。

古いスレッドには追加発言できません。