ダイアログでのツールバー、ステータスバーの扱い方 – プログラミング – Home

ダイアログでのツールバー、ステータスバ...
 
通知
すべてクリア

[解決済] ダイアログでのツールバー、ステータスバーの扱い方


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ダイアログにツールバー、ステータスバーを搭載しました。

疑問 1 ツールバーで UPDATE_COMMAND_UI が動作しない?

UPDATE_COMMAND_UIのハンドラを作成してブレークポイントを置いても
入ってきません。
何故なのか全くわかりません。

疑問 2 ステータスバーにツールバーのヒント?が表示しない?

ツールバーのリソースのプロンプトに
前の写真を表示\n前の写真を表示
を書いたのですが、ステータスバーに何も表示されません。
このツールバーのリソースをMainFrameのツールバーと交換すると期待どうり
ステータスバーに 前の写真を表示 が表示されました。

ステータスバーの作成時に
CreateEx( this, SBT_TOOLTIPS )
と行っているので表示されるはずと思うのですが、何か処理が必要なのでしょうか?

何方かアドバイス、サンプル等のURLを教えて下さい。

WIN2000 SP2
VC6.0 SP5
MFC使用

よろしくお願いします。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

下記の「ダイアログの中にツールバー/ステータス バーを作成する方法は?」が
参考になるかもしれません。

http://www.microsoft.com/JAPAN/developer/library/
jpbkgnd/TechArt/VTools/vc/MFCFAQ.htm


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

回答ありがとうございます。
まさにこれを探していました。

で、参考にしながらやっていてわからないところがあります。

ツールヒント表示の為のメッセージで TTN_NEEDTEXTA、TTN_NEEDTEXTW
を2つとも処理しています。
Aの方がASCIIテキスト、Wの方がUNICODEテキスト なのはわかりましたが、

何がASCII、UNICODEなのでしょう?
TTN_NEEDTEXTで一つではまずいのしょうか?

よろしくお願いします


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

#ifdef UNICODE
#define TTN_NEEDTEXT TTN_NEEDTEXTW
#else
#define TTN_NEEDTEXT TTN_NEEDTEXTA
#endif

です。つまり、TTN_NEEDTEXTだけ実装すれば問題ありません。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます。

ついでに、まだよく理解していない事で

UNICODEやMBCSで移植性が高いアプリが作れますってありますが、
移植性って何に移植するときなんでしょう?

UNICODEやMBCSの使い分けはどのようにするべきでしょう?

宜しくお願いします。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

すみません、まだわからない部分があります。

ステータスバーのペインに表示、ツールバーのヒントに表示は完成しました。
しかし、ON_UPDATE_COMMAND_UIが実現できません。

MSDNのDLGCBR32内に
>WM_IDLEUPDATECMDUIメッセージをメインウィンドウ以外のダイアログボックスに渡すには、
>フレームウィンドウクラスにダイアログポインタを保存し、そのクラス内に
>WM_IDLEUPDATECMDUI ハンドラを作成します。このハンドラから、
>CWnd::SendMessageToDescendants を通じて WM_IDLEUPDATECMDUI メッセージをダイアログ
>ボックスの子ウィンドウに渡します。そして、フレーム ウィンドウ内のメッセージに対して、
>デフォルトの処理を適用します。

とあります。

そこで、フレームウィンドウクラスのCMainFrameに
LRESULT CMainFrame::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)
{
if ( m_pDlg ) { // ダイアログがあるとき
this->SendMessageToDescendants( WM_IDLEUPDATECMDUI, 0, 0, TRUE, TRUE );
}
return 0L;
}
を作成し,ダイアログにWM_IDLEUPDATECMDUIを渡したハズなのですが、
ON_UPDATE_COMMAND_UIが動作しません。
CMainFrame::OnIdleUpdateCmdUIは一応動作しています、ブレークポイントで確認。

ダイアログはモードレスで、CMainFrameの子です、spy++で確認しました。

>フレーム ウィンドウ内のメッセージに対して、デフォルトの処理を適用します。
この部分の デフォルトの処理 とは何の事でしょう?

宜しくお願いします。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

m_pDlg->SendMessageToDescendants(WM_IDLEUPDATECMDUI,
wParam, lParam, TRUE, TRUE );

では?

デフォルトの処理とは、OnIdleUpdateCmdUIハンドラを追加しなかった場合に、
派生元クラスがこのメッセージに対してする処理のことです。
Default();
でそれを呼び出せます。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます!!

ON_UPDATE_COMMAND_UIが実現出来ました!!
m_pDlg->ですよね。
CMainFrameからすべてのウィンドウにメッセージを送るものと勘違いしてました。

>デフォルトの処理とは、OnIdleUpdateCmdUIハンドラを追加しなかった場合に、
>派生元クラスがこのメッセージに対してする処理のことです。
>Default(); でそれを呼び出せます。
の部分がまだよくわかりません。

OnIdleUpdateCmdUIはCMainFrameとダイアログのツールバー、ステータスバーに追加していま

この場合、Default()をどのクラスに追加するのでしょう?

LRESULT CMainFrame::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)
{
if ( m_pDlg ) { // ダイアログがあるとき
m_pDlg->SendMessageToDescendants( WM_IDLEUPDATECMDUI, 0, 0, TRUE,
TRUE );
} else {
this->Default();
}

return 0L;
}

になるのでしょうか?

何度もすみませんが、よろしくお願いします。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

LRESULT CMainFrame::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)
{
if ( m_pDlg ) { // ダイアログがあるとき
...;
return 0L;
} else {
return Default();
}
}

CWndがサポートしているメッセージ(OnKeyDownとか)の場合は、
親クラスの関数を呼び出す(CFrameWnd::OnKeyDown(...)など)と思いますが、
それと同じです。

ところで、

> 移植性って何に移植するときなんでしょう?

UNICODEしかサポートしていないOS(WinCEとか)。

UNICODE/MBCSは使い分けるというよりも、
単にOSに合わせてどちらかを使うだけです。
文字列ポインタを引数に持つAPIやメッセージのほとんどは、
環境に合わせて自動的にUNICODE用かMBCS用に切り替わるようになっています。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

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

解決できました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました