• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ダイアログアプリのウィンドウ領域について)

ダイアログアプリのウィンドウ領域について

a-kumaの回答

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

あまり MFC には詳しくないのですが、 > GetWindowRect(&rect); > if (rect.PtInRect(pos)) { CRect は「矩形領域」を表すクラスですから、四角で反応するのは当たり前でしょう。 リージョンを表すクラス CRgn にも PtInRegion() メソッドがあるので、 それを使ってマウスが上にあるかどうかを判定すれば良いんじゃないか、と。 if (rect.PtInRect(pos)) {  ↓ if (m_rgn.PtInRect(pos)) { って。

yomogikun
質問者

お礼

ご教授ありがとうございます。 m_rgn.PtInRegion(pos) で正常動作いたしました。 CRgn にも PtInRegion ってのがあるんですねー。 勉強になりました。

関連するQ&A

  • ダイアログ上でマウスが止まった事を認識できますか。

    ダイアログ上でマウスが止まった事を認識できますか。 MFCを駆使してダイアログに画像を出力するまでは できました。しかし,そのあと,画像上にマウスで四角の 領域を囲みたいのですが,うまくいきません。 以下にマウスが動く時のソースを記します。 void CDlgDefine::OnMouseMove(UINT nFlags, CPoint point) {  e_pt=point;  CBrush Brush;  CBrush* pBrush;  //s_ptはマウス左ボタン押下時,CPointから座標を取得しています  CRect rect(s_pt.x,s_pt.y,e_pt.x,e_pt.y);  rect.NormalizeRect();  Brush.CreateSolidBrush(RGB(0, 255, 0));  pBrush= pDC->SelectObject(&Brush);  pDC->FrameRect(rect,pBrush);  Invalidate();//これが無い場合,マウスが動くと沢山四角が描かれてしまうのです。 } これで動かすと,マウスが動く瞬間四角がでるのですが,止まると消えてしまいます。 マウスが止まった時,四角がダイアログの画像上に描かれる方法はないでしょうか?

  • MFCでウィンドウ枠をアニメーションさせたい

    こんにちは、VC++初心者です。 今MFCでデスクトップマスコットを作りたいと思っています。 MFCのSDIアプリでとりあえず作成している最中で、 BMP画像の表示はC***ViewクラスのOnDraw関数で表示させています。 問題はウィンドウ枠です。 スタイル指定をWS_POPUPにして、クライアント領域にのみ表示させていますが、 リージョンを使って、BMP画像を切り取った形のウィンドウにするのにてこずっています。 ちうか、そもそもOnDraw関数内でBMP表示とともに行っている、 SetWindowRgn関数がうまく動いてくれていない状態です(泣)。 ソースの一部をのせておきますで、どうかご判断ください。 宜しくお願いします。 CTestView::CTestView() { //コンストラクタでビットマップの読み込みとリージョンの設定 gazou.LoadBitmap( IDB_GAZOU); //CBitmapのメンバ変数 m_rgn[0].CreateEllipticRgn(0, 0, 48,48); //CRgnのメンバ変数1 m_rgn[1].CreateRectRgn(0, 0, 48,48); //CRgnのメンバ変数1 } void CTestView::OnDraw(CDC* pDC) { //画像表示及びリージョンの切り替え 中略... static int anim = 0; CDC dc; dc.CreateCompatibleDC( pDC); dc.SelectObject( gazou); pDC->BitBlt(0,0,48,48,&dc,0,0,SRCAND); //48*48ドットのBMP HRGN hrgn =(HRGN)m_rgn[anim].Detach(); SetWindowRgn( hrgn, true); dc.DeleteDC(); anim ^= 1; 中略... }

  • [Windows][C] ゲームプログラムが実行途中に止まってしまいます

    いつもお世話になっております。 今アクションゲームの基盤となる簡単な動きをさせるプログラムを作成したのですが、なぜだか時間が経つと止まるという不思議な現象に陥っています。 プログラムの内容はジャンプや移動をするだけの単純なもので、描画やキャラの移動はスレッドで個別に行っています。 キャラが止まったとき、FPSは動いていたので、描画の方のスレッドにたぶん問題はないと思っています。 キャラが止まると同時にゲーム自体もおかしくなってしまうのですが、それはキャラ動作のスレッドが異常によって止まってしまったからなのでしょうか? 解決法のわかる方、すみませんがご指導お願いいたします。 以下に問題のあると思われるスレッドを貼ります。 描画やプロシージャに問題があると思われる方がいましたら補足で追加いたします。 /*************** キャラクターを動かす ****************/ DWORD WINAPI CharacterMove(LPVOID vdParam) {  HDC hdc;  RECT rect;  ThreadParam * param;  HRGN hit = CreateRectRgn(0, 0, 0, 0);  int JUMP = 0;  int DBJUMP = 0;  int position = 0;  int flag = 0;  param = (ThreadParam *)vdParam;  GetClientRect(param->owner, &rect);  while(TRUE){   /* 左移動 */   if(character.x > rect.left + 5){    if(GetAsyncKeyState(37)){     if(CombineRgn(           hit,           CreateEllipticRgn(character.x - 12, character.y, character.x - 12 + 25, character.y + 25),           S_RGN, RGN_AND) == NULLREGION){      character.x -= 12;     }    }   }   /* 右移動 */   if(character.x + 25 < rect.right - 5){    if(GetAsyncKeyState(39)){     if(CombineRgn(           hit,           CreateEllipticRgn(character.x + 12, character.y, character.x + 12 + 25, character.y + 25),           S_RGN, RGN_AND) == NULLREGION){      character.x += 12;     }    }   }   /*** ジャンプ ***/   if(CombineRgn(         hit,         CreateEllipticRgn(character.x, character.y + 1, character.x + 25, character.y + 1 + 25),         S_RGN, RGN_AND) != NULLREGION){    if(GetAsyncKeyState(38)){     JUMP = 32;    }   }   /***** ジャンプ時・落下時 *****/   if(CombineRgn(         hit,         CreateEllipticRgn(character.x, character.y + 1, character.x + 25, character.y + 1 + 25),         S_RGN, RGN_AND) == NULLREGION || JUMP == 32){    /*** 一度キーを離さないと2段ジャンプは成立しない ***/    if(!GetAsyncKeyState(38)){     flag = 1;    }    /*** 2段ジャンプ ***/    if(GetAsyncKeyState(38) && flag == 1 && DBJUMP < 1){     JUMP = 26;     DBJUMP++;    }    /*** 慣性 ***/    if(CombineRgn(          hit,          CreateEllipticRgn(character.x, character.y - JUMP, character.x + 25, character.y - JUMP + 25),          S_RGN, RGN_AND) != NULLREGION){     flag = 0;     DBJUMP = 0;     if(JUMP < 0){      while(CombineRgn(             hit,             CreateEllipticRgn(character.x, character.y + 1, character.x + 25, character.y + 1 + 25),             S_RGN, RGN_AND) == NULLREGION){       character.y++;      }     }else{      while(CombineRgn(             hit,             CreateEllipticRgn(character.x, character.y -1, character.x + 25, character.y + 1 + 25),             S_RGN, RGN_AND) == NULLREGION){       character.y--;      }     }     JUMP = 0;    }else{     character.y -= JUMP;    }    /* 最大落下速度 */    if(JUMP > -20){     JUMP -= 3;    }   }   Sleep(16);  }  DeleteObject(hit);  ReleaseDC(param->owner, hdc);  return TRUE; }

  • SetWindowRgn()関数について。

     アニメーションするデスクトップアクセサリみたいなものを作ろうとしています。 しかし、SetWindowRgn()関数をうまく動作させる事が出来ないので質問させてください。 現在、 CRgn* _pRgns; CBitmap* _pBitmap; をメンバ変数として用意し、あらかじめビットマップの形をしたリージョンをフレーム枚数だけ_pRgnsに配列として作成しています。 onTimer() 関数内で、フレーム位置をインクリメントし、該当フレーム番号のビットマップとリージョンを適用後、描画させています。 この方法でアニメーションをさせた場合、ループ再生にしなければ問題なく動作するのですが、二回目のループになった時に、リージョンを再度SetWindowRgn()関数で設定すると失敗してしまいます。 (戻り値として0が帰ってきます。) SetWindowRgn()関数の使い方がまずいのでしょうか。 ご存知の方おられましたら、教えていただけますでしょうか? よろしくお願いします。 void TestAppDlg::OnTimer(UINT nIDEvent) { CString mes; _frameNo++; if ( _frameNo > 5 ) _frameNo = 0; // フレーム位置を先頭に戻す。 // ビットマップを選択 _pMemDC->SelectObject( _pBitmap + _frameNo ); // 非矩形ウィンドウの設定 int ret = SetWindowRgn( *(_pRgns + _frameNo), true ); if ( ret == 0 ){ // リージョンの設定に失敗 stopTimer(); } // 描画 drawScene() ; CDialog::OnTimer(nIDEvent); } 開発環境: Windows XP Professional SP1 Microsoft Visual C++ .NET

  • win32 ダイアログリソース ピクチャコントロールで表示

    win32、visualC++2005、winxp_sp3で開発してます。 ダイアログリソースでピクチャコントロールを使いビットマップ画像を表示させたいのですが分かりません。 プロパティのIMEGEに画像の名前を入力するのだと思ったのですがダメでした。 画像はソリューションの中に入れてあるんですが・・・ 表示する方法を教えてください。 ほかのコントロールでも出来るならそれでもいいです。 本当に初心者でアホなんで誰か教えてください。m__m

  • 丸いボタンの表示でCPU100%

    VC6.0でMFCアプリケーションを作成しています。 ・ダイアログベース ・背景はビットマップ(スタイルにWS_CLIPCHILDRENを追加) ・ボタンはビットマップ&非矩形(丸) これを作成し、実行するとCPU使用率が100%になってしまいます。 OnPaint()での描画をしなければ、ボタンが丸く表示されません。 ご存知の方は教えてください。 以下、ソース抜粋です。 メンバ CButton m_cbImage; CBitmap m_cBmpBack; CBitmap m_cBmpButton; HBITMAP m_hBmpBack; BITMAP m_bmp; HDC m_hDc; OnInitDialog(){ //背景ビットマップ m_cBmpBack.LoadBitmap(IDB_BITMAP_BACK); //ボタンビットマップ m_cBmpButton.LoadBitmap(IDB_BITMAP_BUTTON); HBITMAP hBmpButton = HBITMAP(m_cBmpButton); m_cbImage.SetBitmap(hBmpButton); // ウィンドウに関する情報を取得 // BMPサイズ取得 m_hBmpBack = HBITMAP(m_cBmpBack); GetObject(m_hBmpBack, sizeof(BITMAP), &m_bmp); // BMPデバイスコンテキスト作成 m_hDc = CreateCompatibleDC(NULL); // オブジェクトを選択する SelectObject(m_hDc, m_hBmpBack); // ボタン変形 CRect cRectButton; m_cbImage.GetClientRect(cRectButton); CRgn rgnButton; rgnButton.CreateEllipticRgn(cRectButton.Width() * 1 / 8, cRectButton.Height() * 1 / 8, cRectButton.Width() * 7 / 8, cRectButton.Height() * 7 / 8); m_cbImage.SetWindowRgn((HRGN)rgnButton, TRUE); } OnPaint(){ HDC hdc = ::GetDC(m_hWnd); BitBlt(hdc, 0, 0, (int)m_bmp.bmWidth, (int)m_bmp.bmHeight, m_hDc, 0, 0, SRCCOPY); ::ReleaseDC(m_hWnd, hdc); } 以上、よろしくお願いします。

  • コントロールのフォントの変更

    コントロールに任意のフォントを指定できなくて困っています。 class CFrame : public CFrame { private: CFont m_cFont; CStatic m_cStatic; public: CFrame(); afx_msg void OnCreate(LPCREATESTRUCT); }; CFrame::CFrame() { Create( // 省略 ); m_cFont.CreateFont( // 省略 ); } axf_msg void CFrame::OnCreate(LPCREATESTRUCT lp) { RECT rect; DWORD dw; rect.top = 10; rect.left = 10; rect.right = 100; rect.bottom = 60; dw = WS_CHILD | WS_VISIBLE; m_cStatic.Create("AAAAAA", dw, rect, this, ID); m_cStatic.SetFont(&m_cFont, TRUE); } 文字は表示されるのですが、フォントがおそらくデフォルトのままだと思われるのですが、どうしてかわかりません。 ダイアログベースでは、OnInitDialogで実行していたと思いますが、以上のコードではだめなんでしょうか? よろしくお願いします。

  • メインダイアログのデータをウィンドウに反映させたい

    メインダイアログからウィンドウを生成しています ダイアログの値を GetDlgItemText()関数で取るまではいいのですが それから、値をウィンドウに反映できません。 メンバ値を遣うと思うのですが、どうすればいいのでしょうか? プログラムを添付します ///////////////////////////////////////////////////////// // dlg.rc #include "resource.h" #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// // // Dialog // MYDLG DIALOG DISCARDABLE 0, 0, 134, 80 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "ダイアログからウィンドウ" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,15,55,50,14 PUSHBUTTON "キャンセル",IDCANCEL,65,55,50,14 EDITTEXT IDC_EDIT1,15,10,100,35,ES_AUTOHSCROLL END ////////////////////////////////////////////////// // resource.h #define IDC_EDIT1 1000 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif //////////////////////////////////////////////////////// // dlg.h //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //ウィンドウ class CMyWindow : public CFrameWnd { private: CString MyMainStr; protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; //メインダイアログ class CMyDlg : public CDialog { public: CString m_MyStr; CMyDlg(CWnd *pParentWnd=NULL); CMyWindow* m_pMyWnd; protected: virtual void OnOK(); virtual void OnCancel(); }; ///////////////////////////////////////////// // DlgWnd.cpp #include <afxwin.h> #include <afxdlgs.h> #include <string.h> #include "dlg.h" #include "resource.h" CMyApp myApp; BOOL CMyApp::InitInstance(){ m_pMainWnd = new CMyDlg; m_pMainWnd ->ShowWindow(m_nCmdShow); m_pMainWnd ->UpdateWindow(); return TRUE; } CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/):m_pMyWnd(NULL) //イニシャライザでポインタをNULLに初期化 { Create("MYDLG"); } BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() void CMyDlg::OnOK() { GetDlgItemText(IDC_EDIT1, m_MyStr); const RECT rc = {10, 10, 320, 240}; m_pMyWnd = new CMyWindow(); m_pMyWnd->Create( NULL, "ダイアログから起動", WS_OVERLAPPEDWINDOW, rc, this,NULL); m_pMyWnd->ShowWindow(SW_SHOW); } void CMyDlg::OnCancel() { DestroyWindow(); } void CMyWindow::OnPaint() { CPaintDC dc(this); CMyDlg dlg; MyMainStr = dlg.m_MyStr; dc.TextOut(0, 0, MyMainStr); } よろしく御願いします

  • MFCダイアログベースでのボタン背景透過方法

    VC++初心者です。 MFCダイアログベースでボタンを描画したいのですが、 そのボタンの背景を透過(透明)にしたいのです。 環境はWinXP、VSC++2010です。 OnCtrlColor()関数でSetBkMode(TRANSPARENT)や brash.CreateStockObject(NULL_BRUSH)などを実装していますが、 背景は変わりません。 ちなみに、ダイアログにはbitmap画像を貼りつけています。 ボタンはCMFCButtonを使用しているので、 CMFCButtonの変数m_mfcBtnのメンバ(プロパティ?)の m_bTransparentをTrueにしてもダメでした。 なぜ背景が透過できないのかわかりません。 ご教授宜しくお願いします。

  • 文字のロールオーバーについて教えてください。

    HPを作製しているのですが、リンクを張った文字にロールオーバーをつけたくて、スタイルシートで、やってみたのですが、そうすると画像を張ったリンクにマウスを持ってきても周りの色が四角に、指定した色に変わってしまいます。(画像は、楕円形のボタンです) 文字のみロールオーバーをつけたい場合はどうしたらいいのか教えてください。

    • ベストアンサー
    • HTML