みなさん、こんにちは。
現在、ダイアログベースでアプリを作成しています。
アプリの仕様は、ボタンを押下後、検索用の別スレッドを起動し、
検索処理終了後にメッセージイベントを受けて、検索結果を画面
に表示する仕様です。
どうしても検索に時間がかかるので、ボタンを押下~検索結果の
画面表示まで、マウスカーソルを砂時計するため、ボタン押下後
にBeginWaitCursor関数を呼び出しているのですが、マウスカー
ソル砂時計になってくれません。
ダイアログベースのアプリの場合は、何か制限のようなものがあ
るのでしょうか?
何方かご存知の方おられましたら、ご教授の方お願い致します。
CCmdTarget::BeginWaitCursor() CCmdTarget::EndWaitCursor()
CWaitCursor クラス
CWinApp::DoWaitCursor()
は1つのメッセージ処理の中でのみ有効です。
メッセージ処理をまたがってカーソルを変更する場合は、
ウィンドウクラスのカーソルを切り替えるという方法があります。
この場合、ダイアログだけでなく子ウィンドウすべてのカーソルを切り替える必要があります。
void CxxxDlg::OnStart()
{
SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)AfxGetApp()->LoadStandardCursor
(IDC_WAIT)) ;
}
void CxxxDlg::OnEnd()
{
SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)AfxGetApp()->LoadStandardCursor
(IDC_ARROW)) ;
}
他にも方法があったら、私にも教えてください。
メインウィンドウのOnSetCursor()で
砂時計カーソルをセットすればOKです。
dairygoods 様 ありがとうございます。
void CxxxDlg::OnBnClickedButtonon()
{
m_bWait = TRUE ;
}
void CxxxDlg::OnBnClickedButtonoff()
{
m_bWait = FALSE ;
}
BOOL CxxxDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(m_bWait) {
SetClassLong(pWnd->GetSafeHwnd(), GCL_HCURSOR, (long)
AfxGetApp()->LoadStandardCursor(IDC_WAIT)) ;
}
else {
SetClassLong(pWnd->GetSafeHwnd(), GCL_HCURSOR, (long)
AfxGetApp()->LoadStandardCursor(IDC_ARROW)) ;
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
ですね。勉強になりました。
汎さん、dairygoodsさん、お返事ありがとうございます。
教えて頂いた方法で、上手く動作致しました。
今回は本当にありがとうございました。m(_)m
また、何かありましたらご質問する事があるかと思いますが
その際は、宜しくお願い致します。
それでは、失礼致します。
こんな方法でも可能です。
BOOL CxxxDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(m_bWait) {
::SetCursor(::LoadCursor(NULL,IDC_WAIT)) ;
return TRUE;
} else {
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
}