同时打开两个一样的程序,在一个窗口里画线,要在另一个程序的窗口中同时显示出这条直线,用SENDMESSAGE该怎么写啊?我都写了半天了.
解决方案 »
- VC雕虫小技集(三)
- 大家来看下这种情况应该响应哪个消息? OnInitDialog之后
- 再问个愚蠢的问题,对话框编辑器的工具箱不见了,从哪里调出来?
- SOCKET____重叠I/O
- 如何得到listview列表中某一列的最大值数?
- 子窗口的LoadFrame(...)问题,快帮帮忙兄弟们
- 控件的受权签名如何办理,什么机构
- error LNK2001: unresolved external symbol __endthreadex
- 处理ACCESS2000中的时间类型——初学者在线等,急!
- 编程实现Win2000帐号自动登录的问题,进来拿分 --->>>>
- 有沒有VC開發的管理系統的例子及源碼,供學習使用,謝謝.
- 这个是什么错误?有的工程可以编译,有的不行了?
{
WNDCLASS wndclass;
MSG msg;
HWND hwnd; wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL,IDI_WINLOGO);
wndclass.hInstance = hInst;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_VREDRAW | CS_HREDRAW; RegisterClass(&wndclass); hwnd = CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInst,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
DispatchMessage(&msg);
return msg.wParam;
}void NotifyAllSblings(UINT msg,WPARAM wParam,LPARAM lParam)
{
HWND hwnd; hwnd = FindWindowEx(NULL,NULL,szAppName,NULL);
while (hwnd != NULL)
{
PostMessage(hwnd,msg,wParam,lParam);
hwnd = FindWindowEx(NULL,hwnd,szAppName,NULL);
}
}LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static POINT start,end,cur; switch(msg)
{
case WM_LBUTTONDOWN + WM_USER:
case WM_LBUTTONDOWN:
if (msg == WM_LBUTTONDOWN)
{
SetCapture(hwnd);
NotifyAllSblings(msg + WM_USER,wParam,lParam);
}
else
{
start.x = start.y = -1; end = start;
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
start.x = LOWORD(lParam);
start.y = HIWORD(lParam);
end = start;
}
break;
case WM_MOUSEMOVE + WM_USER:
case WM_LBUTTONUP + WM_USER:
case WM_MOUSEMOVE:
case WM_LBUTTONUP:
if ((msg == WM_MOUSEMOVE || msg == WM_LBUTTONUP))
{
if (GetCapture() == hwnd)
{
if (msg == WM_LBUTTONUP) ReleaseCapture();
NotifyAllSblings(msg + WM_USER,wParam,lParam);
}
}
else
{
hdc = GetDC(hwnd);
SetROP2(hdc,R2_NOT); MoveToEx(hdc,start.x,start.y,NULL);
LineTo(hdc,end.x,end.y); end.x = LOWORD(lParam);
end.y = HIWORD(lParam);
MoveToEx(hdc,start.x,start.y,NULL);
LineTo(hdc,end.x,end.y); ReleaseDC(hwnd,hdc);
}
break; case WM_PAINT:
hdc = BeginPaint(hwnd,&ps); MoveToEx(hdc,start.x,start.y,NULL);
LineTo(hdc,end.x,end.y); EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
WM_USER 不是消息,它是Windows系统定义的ID最大的消息。用户自定义的消息必须大于它,所以一般自定义消息都写成这个样子:
#define WM_MYMESSAGE WM_USER + 100
我在程序里面使用了3个自定义消息:WM_LBUTTONDOWN + WM_USER,WM_MOUSEMOVE + WM_USER和
WM_LBUTTONUP + WM_USER,不过没有写成上述形式。其实你可以自己改成:
#define WM_MYLBUTTONDOWN WM_USER + 100
#define WM_MYMOUSEMOVE WM_USER + 200
#define WM_MYLBUTTONUP WM_USER + 300
这样的形式的。SetCapture()的功能是设置鼠标捕获。一般情况下,鼠标从移动到窗口外面之后,窗口就收不到鼠标消息了。用SetCapture()设置鼠标捕获后,即使鼠标移动到了窗口外面,Windows也还是把鼠标消息发送到窗口。GetCapture()的功能是取得系统中当前捕获鼠标的窗口的句柄。ReleaseCapture()的功能是释放鼠标捕获。你的程序如果一直捕获鼠标,那么别的程序就收不到鼠标消息了,这在多任务的Windows环境中是不礼貌的,所以应该在适当的时候释放鼠标捕获。最后说明一点,为了防止捕获鼠标的窗口出现意外(如死循环)而不能释放鼠标捕获,Windows要求当鼠标键处于按下状态时,鼠标捕获才有用,也就是说,松开鼠标键后,即使你不释放鼠标捕获,Windows也会自动释放鼠标捕获。