首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎么让鼠标所画的东西不消失

2012-03-17 
如何让鼠标所画的东西不消失 - C++ Builder / Windows SDK/API不知道是不是在这个论坛提问的,最近在学习《W

如何让鼠标所画的东西不消失 - C++ Builder / Windows SDK/API
不知道是不是在这个论坛提问的,最近在学习《WINDOWS程序设计》第7章的时候,有这么一个程序,用鼠标的例子,不过我运行后停留一段时候或重新按下鼠标,之前所画的就木有了,我想把之前的保留下来,顺便请教下,我鼠标点击的换种颜色,求高手修改下,谢谢啦

C/C++ code
 
#include "stdafx.h"
#include "打老鼠.h"

#define MAXPOINTS 1000

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevstance,
PSTR szCmdLine,
int iCmdShow)
{
static TCHAR name[] = TEXT("打老鼠");
HWND  hwnd;
MSG    msg;
WNDCLASS  wndclass;

wndclass.style          = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc    = WndProc;
wndclass.cbClsExtra    = 0;
wndclass.cbWndExtra    = 0;
wndclass.hInstance      = hInstance;
wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName  = NULL;
wndclass.lpszClassName  = name;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("这个程序需要在WINDOWS NT下运行"),
name, MB_ICONERROR | MB_YESNOCANCEL | MB_DEFBUTTON3 | MB_HELP);
return 0;
}

hwnd = CreateWindow(name, TEXT("打老鼠"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

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

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static POINT pt[MAXPOINTS];
static int  iCount;
HDC          hdc;
int          i, j;
PAINTSTRUCT  ps;

switch(message)
{
case WM_LBUTTONDOWN:
iCount = 0;
InvalidateRect(hwnd, NULL, TRUE);    //向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制
return 0;

case WM_MOUSEMOVE:
if(wParam &MK_LBUTTON && iCount < 1000)
{
pt[iCount  ].x = LOWORD(lParam);
pt[iCount++].y = HIWORD(lParam);

hdc = GetDC(hwnd);
SetPixel(hdc, LOWORD(lParam), HIWORD(lParam), 0);
ReleaseDC(hwnd, hdc);
}
return 0;

case WM_LBUTTONUP:
InvalidateRect(hwnd, NULL, FALSE);
return 0;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);

SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
for(i = 0; i < iCount - 1; i++)
for(j = i + 1; j < iCount; j++)
{
MoveToEx(hdc, pt[i].x, pt[i].y, NULL);
LineTo(hdc, pt[i].x, pt[i].y);
}

ShowCursor(FALSE);
SetCursor(LoadCursor(NULL, IDC_ARROW));
EndPaint(hwnd, &ps);
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

押宝了太多,所以分不多,希望大家指点下小弟

[解决办法]
1.重绘肯定是可以的。
2.这个程序跟BCB一点关系都没有[意思是lz还没有脱离vc MFC的编程模式]
利用窗体的mousemove down up 三个事件就可以了。
3.点击换颜色,用pen->color就行了,或者用API 新建画笔createpen
------解决方案--------------------


窗口dc的内容是不稳定的,没开dwm时被遮挡都会被改变
你最好创建一个内存dc,给内存dc一个位图,然后在这个位图中作画,每次WM_PAINT时把内存dcBitBlt给窗口dc

热点排行