ダイアログにツールバー、ステータスバーを搭載しました。
疑問 1 ツールバーで UPDATE_COMMAND_UI が動作しない?
UPDATE_COMMAND_UIのハンドラを作成してブレークポイントを置いても
入ってきません。
何故なのか全くわかりません。
疑問 2 ステータスバーにツールバーのヒント?が表示しない?
ツールバーのリソースのプロンプトに
前の写真を表示\n前の写真を表示
を書いたのですが、ステータスバーに何も表示されません。
このツールバーのリソースをMainFrameのツールバーと交換すると期待どうり
ステータスバーに 前の写真を表示 が表示されました。
ステータスバーの作成時に
CreateEx( this, SBT_TOOLTIPS )
と行っているので表示されるはずと思うのですが、何か処理が必要なのでしょうか?
何方かアドバイス、サンプル等のURLを教えて下さい。
WIN2000 SP2
VC6.0 SP5
MFC使用
よろしくお願いします。
下記の「ダイアログの中にツールバー/ステータス バーを作成する方法は?」が
参考になるかもしれません。
http://www.microsoft.com/JAPAN/developer/library/
jpbkgnd/TechArt/VTools/vc/MFCFAQ.htm
回答ありがとうございます。
まさにこれを探していました。
で、参考にしながらやっていてわからないところがあります。
ツールヒント表示の為のメッセージで TTN_NEEDTEXTA、TTN_NEEDTEXTW
を2つとも処理しています。
Aの方がASCIIテキスト、Wの方がUNICODEテキスト なのはわかりましたが、
何がASCII、UNICODEなのでしょう?
TTN_NEEDTEXTで一つではまずいのしょうか?
よろしくお願いします
#ifdef UNICODE
#define TTN_NEEDTEXT TTN_NEEDTEXTW
#else
#define TTN_NEEDTEXT TTN_NEEDTEXTA
#endif
です。つまり、TTN_NEEDTEXTだけ実装すれば問題ありません。
ありがとうございます。
ついでに、まだよく理解していない事で
UNICODEやMBCSで移植性が高いアプリが作れますってありますが、
移植性って何に移植するときなんでしょう?
UNICODEやMBCSの使い分けはどのようにするべきでしょう?
宜しくお願いします。
すみません、まだわからない部分があります。
ステータスバーのペインに表示、ツールバーのヒントに表示は完成しました。
しかし、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++で確認しました。
>フレーム ウィンドウ内のメッセージに対して、デフォルトの処理を適用します。
この部分の デフォルトの処理 とは何の事でしょう?
宜しくお願いします。
m_pDlg->SendMessageToDescendants(WM_IDLEUPDATECMDUI,
wParam, lParam, TRUE, TRUE );
では?
デフォルトの処理とは、OnIdleUpdateCmdUIハンドラを追加しなかった場合に、
派生元クラスがこのメッセージに対してする処理のことです。
Default();
でそれを呼び出せます。
ありがとうございます!!
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;
}
になるのでしょうか?
何度もすみませんが、よろしくお願いします。
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用に切り替わるようになっています。
いろいろとありがとうございました。
解決できました。