![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.4ベストアンサー
- 回答日時:
hPhotoを取得しただけで何もしていないように見えますが。
プロシージャを自作のものに置き換えたいのであればSetWindowLongで新しいプロシージャへのポインタを送らないといけないですが、省略しただけなのでしょうか。
このままではPhotoProcは作られだけで、一切処理されていません。
PhotoProcにあるWM_CREATEもSetWindowLongで置きかえる頃にはとっくに別のプロシージャで処理済みなので、実行されないコードですね。
> DefWindowProc(hPhoto, msg, wp, lp)
もCallWindowProcにしてください。
OpenCVが持っているプロシージャを置き換えるのですから、OpenCVのプロシージャに戻さないと変な動作をするようになるはずです。
マウス関連のメッセージを自分で処理したいだけであれば、cvSetMouseCallbackの方が簡単かもしれません。
WM_MOUSEMOVE、WM_?BUTTONDOWN/UP/DBLCLKがcvSetMouseCallbackで指定した関数に送られてくる(名前は変わってますが)ようになります。
CV_EXTERN_C_FUNCPTR( void (*CvMouseCallback )(int event, int x, int y, int flags) );
HIGHGUI_API void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse );
イメージとしてはこんな感じですね。実際は色々と違いますけど。
on_mouse(msg, LOWORD(lParam), HIWORD(lParam), wParam);
ライブラリ等を使う場合は、HWNDやポインタが取得できるからと言って、むやみに使用してしまうとライブラリ自体の誤動作を招きかねないので、できるだけライブラリが提供している関数群を使うようにしたほうがいいです。
とても詳しいご説明感謝しております。
回答を参考に試行錯誤してみたいと思います。
また質問をするかもしれませんが、そのときはよろしくお願いします。
ほんとうにありがとうございました。
No.3
- 回答日時:
cvNamedWindowで付けた名前をcvGetWindowHandleに渡して、返り値をHWNDにキャストしたらできないでしょうか。
参考URL:http://www.cs.bham.ac.uk/resources/courses/robot …
この回答への補足
回答の通りやってみましたが、ウインドウにマウス座標が表示されません。どこが悪いのでしょうか?プログラムを載せますのでタイヘンだとは思いますがお願いいます。
#include <cv.h>
#include <highgui.h>
#include <windows.h>
#include <string.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK PhotoProc(HWND,UINT,WPARAM,LPARAM);
void ShowPoint(HWND,POINTS);
char szClassNme[] = "WinName";
BOOL bCap = FALSE;
IplImage *image;
FILE *fp;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS myProg;
if (!hPreInst) {
myProg.style =CS_HREDRAW | CS_VREDRAW;
myProg.lpfnWndProc =WndProc;
myProg.cbClsExtra =0;
myProg.cbWndExtra =0;
myProg.hInstance =hInstance;
myProg.hIcon =NULL;
myProg.hCursor =LoadCursor(NULL, IDC_ARROW);
myProg.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);//GetStockObject(WHITE_BRUSH);
myProg.lpszMenuName =NULL;
myProg.lpszClassName =szClassNme;
if (!RegisterClass(&myProg))
return FALSE;
}
hWnd = CreateWindow(szClassNme,
"CVWINDOW",
WS_OVERLAPPEDWINDOW,
600,
400,
100,
100,
0,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (0);
}
//********メインウィンドウプロシージャ***********
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND hPhoto;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
fp = fopen("image1.png", "rb");
if(!fp){
fprintf(stderr,"Unable to open file \n");
exit(1);
}
image = cvLoadImage( "image1.png", 3);
cvNamedWindow("cam", CV_WINDOW_AUTOSIZE);
cvShowImage("cam",image);
hPhoto = (HWND)cvGetWindowHandle("cam");
return (0);
case WM_KEYDOWN:
if(wParam == VK_ESCAPE){
PostMessage(hWnd, WM_CLOSE, 0, 0);
}
return(0);
case WM_CLOSE:
DestroyWindow(hWnd);
return(0);
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0);
}
//************photoウィンドウプロシージャ*****************
LRESULT CALLBACK PhotoProc(HWND hPhoto, UINT msg, WPARAM wp, LPARAM lp)
{
POINTS pts;
switch (msg) {
case WM_LBUTTONDOWN:
bCap = TRUE;
SetCapture(hPhoto);
pts = MAKEPOINTS(lp);
ShowPoint(hPhoto, pts);
break;
case WM_MOUSEMOVE:
if (bCap) {
SetCursor(LoadCursor(NULL, IDC_CROSS));
pts = MAKEPOINTS(lp);
ShowPoint(hPhoto, pts);
} else
SetCursor(LoadCursor(NULL, IDC_ARROW));
break;
case WM_LBUTTONUP:
SetCursor(LoadCursor(NULL, IDC_ARROW));
ReleaseCapture();
bCap = FALSE;
break;
case WM_CREATE:
SetCursor(LoadCursor(NULL, IDC_ARROW));
break;
case WM_CLOSE:
DestroyWindow(hPhoto);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hPhoto, msg, wp, lp));
}
return 0L;
}
void ShowPoint(HWND hPhoto, POINTS pt)
{
char str[256];
char *sp = " ";
HDC hdc;
wsprintf(str, "x = %3d, y = %3d", pt.x, pt.y);
hdc = GetDC(hPhoto);
TextOut(hdc, 20, 20, sp, strlen(sp));
TextOut(hdc, 20, 20, str, strlen(str));
ReleaseDC(hPhoto, hdc);
return;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- AJAX 自作の地図をグーグルマップのようにしたい 3 2022/11/15 11:53
- その他(ソフトウェア) Figma 1 2023/06/23 14:22
- Windows 10 2つのウィンドウ選択時の表示について 10 2023/07/25 08:48
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Chrome(クローム) googleアカウントのアイコンをローマ字または漢字で表示させたい 2 2023/05/06 22:25
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
Excelでの項目名固定
-
ラジオボタンの初期指定
-
ゲームでは結局どっちが良いの?
-
MDI(自作メモ帳)の子ウィンドウ...
-
C++ 子ウィンドウのハンドルを...
-
作成したウインドウのサイズを...
-
UWSCで特定のChromeのタブをア...
-
【VB2008】 マウス操作の一時的...
-
Vba LongPtrについて教えてくだ...
-
最大化と最小化ボタン
-
EXCEL2016で新しいウィンドウを...
-
eclipseからコンソールが消えた
-
Alt+P,Alt+NをPostmessageで送...
-
他アプリの操作(メニューバー)
-
DellノートPC購入で悩んでいま...
-
VBで外部プログラムを位置のみ...
-
「&HFFFF」「&H1A」とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
ゲームでは結局どっちが良いの?
-
ラジオボタンの初期指定
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
ExcelのBOOKが消えた!
-
他のアプリケーションの終了処理
-
Vba LongPtrについて教えてくだ...
-
作成したウインドウのサイズを...
-
UWSCで特定のChromeのタブをア...
-
[VBA] UserForm を Excel の W...
-
MFC ダイアログ上のID取得につ...
-
Alt+P,Alt+NをPostmessageで送...
-
「&HFFFF」「&H1A」とは?
-
ExcelVBAでAPIを使って外部ウイ...
-
親ウインドウにあるOKボタンを...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報