跪求高手解决下面的win32程序(全API函数不涉及到MFC的解决方法)(让所画的线条在窗口外不闪烁)

dhzy1230 2009-09-18 10:24:54
#include <windows.h>

#include <stdio.h>

HWND MainHwnd;
HWND TrackHwnd;
HWND Hd;
POINT point;
POINT pos;


UINT xCoor ;
UINT yCoor ;
UINT g_nXCoor;
UINT g_nYCoor;



LRESULT CALLBACK WndProcMain (HWND hWnd, UINT message, WPARAM wParam ,LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev,
char * lpCmdLine, int nShowCmd )

{



WNDCLASSEX WndClassEx;

//窗口类定义
WndClassEx.cbSize = sizeof( WNDCLASSEX );
WndClassEx.style = NULL;
WndClassEx.lpfnWndProc = WndProcMain;

WndClassEx.cbClsExtra = 0;
WndClassEx.cbWndExtra = 0;
WndClassEx.hInstance = hInstance;
WndClassEx.hIcon = LoadIcon( NULL, IDI_APPLICATION ); //窗口的最小化图标为默认图标
WndClassEx.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
WndClassEx.hCursor = LoadCursor( NULL, IDC_ARROW ); //窗口采用箭头光标
WndClassEx.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//窗口背景为灰色


WndClassEx.lpszMenuName = NULL;
WndClassEx.lpszClassName = "MyWndClassMain";


::RegisterClassEx( &WndClassEx );



MainHwnd = CreateWindow ( "MyWndClassMain", "My First Windows", WS_OVERLAPPEDWINDOW,
100, 100, 600, 600, NULL, NULL, hInstance, NULL);






Hd = GetDesktopWindow();

ShowWindow (MainHwnd, nShowCmd );
UpdateWindow(MainHwnd);



MSG msg;
while( GetMessage( &msg,NULL,NULL,NULL ) )
{
TranslateMessage(&msg);
DispatchMessage( &msg );
}
return 0;
}



LRESULT CALLBACK WndProcMain (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_MOUSEMOVE:

g_nXCoor = LOWORD( lParam );
g_nYCoor = HIWORD( lParam );

GetCursorPos(&pos);
xCoor = pos.x;
yCoor = pos.y;
point.x = g_nXCoor;
point.y = g_nYCoor;
Hd = GetDesktopWindow();

//ClientToScreen(hWnd, &point);

InvalidateRect( NULL,NULL,TRUE );


/*RedrawWindow(NULL,
NULL,
NULL,
RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN); */










case WM_LBUTTONDOWN:
SetCapture(MainHwnd);
InvalidateRect(NULL,NULL,TRUE);
break;
case WM_LBUTTONUP:
ReleaseCapture();
InvalidateRect(NULL,NULL,TRUE);
break;

case WM_PAINT:
{

HDC hDC;
RECT rectClient;
PAINTSTRUCT PS;

hDC = GetDC(NULL);



GetWindowRect(Hd, &rectClient);

//划线
MoveToEx (hDC, pos.x, rectClient.top, NULL );
LineTo (hDC, pos.x, rectClient.bottom);

MoveToEx (hDC, rectClient.left, pos.y, NULL );
LineTo (hDC, rectClient.right, pos.y);



CHAR strMousePosition[100];

hDC = BeginPaint (hWnd, &PS);




sprintf (strMousePosition, "Mouse Pt: x= %4d y = %4d", pos.x, pos.y);


TextOut (hDC, 0, 0, strMousePosition, strlen ( strMousePosition));//文字输出
EndPaint(hWnd, &PS);

ReleaseDC(Hd,hDC);

}
break;

case WM_DESTROY:
PostQuitMessage ( 0 );
break;

default:
return DefWindowProc(hWnd, message, wParam, lParam );
}

return TRUE;
}

...全文
138 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
p17939845 2009-09-18
  • 打赏
  • 举报
回复
你想做图形编辑? MOUSEMOVE消息不要重画窗口,一般只有当一次编辑操作结束后才重画。
如果操作简单的矩形可以用CRectTracker,编辑其它的图形就自己做一个类,做法可以参考CRectTracker.
想抹掉以前化的内容可以看一下SetROP2这个函数,参数用R2_XORPEN。不懂可以再问


vcTiro 2009-09-18
  • 打赏
  • 举报
回复
如果画的东西太多,建议用双缓冲。
flyskytoday 2009-09-18
  • 打赏
  • 举报
回复
InvalidateRect(NULL,NULL,TRUE);
-------->
InvalidateRect(NULL,NULL,FALSE);
dhzy1230 2009-09-18
  • 打赏
  • 举报
回复
只是一个获取屏幕坐标的小程序 随着鼠标的移动在整个屏幕上画个十字并显示坐标,我现在功能基本上实现了 就是外观不行刷新有问题 能不能帮我把上面的程序修改一下

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧