求教windows编程高手~~

Who_know_me 2008-10-12 01:08:14
#include <windows.h>

#define MAXPOINTS 1000

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


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static TCHAR szAppName[] = TEXT ("Connect") ;

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 = szAppName ;

if (!RegisterClass (&wndclass))

{

MessageBox (NULL, TEXT ("Program requires Windows NT!"),

szAppName, MB_ICONERROR) ;

return 0 ;

}

hwnd = CreateWindow (szAppName, TEXT ("Connect-the-Points Mouse Demo"),

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 ;

PAINTSTRUCT ps ;

switch (message)

{

case WM_MOUSEMOVE:

if (wParam & MK_LBUTTON && iCount < 1000)

{

pt[iCount ].x = LOWORD (lParam) ;

pt[iCount].y = HIWORD (lParam) ;

iCount++;

hdc = GetDC (hwnd) ;
SetPixel (hdc, LOWORD (lParam), HIWORD (lParam), 0) ;
InvalidateRect (hwnd, NULL, TRUE) ;

ReleaseDC (hwnd, hdc) ;

}

return 0 ;

case 在
hdc = BeginPaint (hwnd, &ps) ;
Polyline (hdc, pt, MAXPOINTS) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY:

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}

上面的代码目的是创建一个窗口然后在窗口内实现画任意的曲线~,
我首先是获取鼠标点的坐标然后将这些点的坐标存储在一个数组内,然后想在WM_PAINT消息内实现画曲线。
可是我努力了好久就是实现不了~
恳请前辈们帮我看看上面的代码,谢谢~

...全文
200 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
redleaves 2008-10-13
  • 打赏
  • 举报
回复
#include <windows.h> 
#define MAXPOINTS 1000

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

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Connect") ;
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 = szAppName ;
if (!RegisterClass (&wndclass)) {
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Connect-the-Points Mouse Demo"),
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 ;
PAINTSTRUCT ps ;
switch (message)
{
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON && iCount < MAXPOINTS) {
pt[iCount].x = LOWORD (lParam) ;
pt[iCount].y = HIWORD (lParam) ;
iCount++;
}
InvalidateRect (hwnd, NULL, FALSE);
break;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
Polyline (hdc, pt, iCount) ;
EndPaint (hwnd, &ps) ;
break;
case WM_DESTROY:
PostQuitMessage (0) ;
break;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
glacier3d 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Who_know_me 的回复:]
楼上前辈说的办法还是不行~~
这是什么原因啊???
[/Quote]

把Polyline (hdc, pt, MAXPOINTS) 的 MAXPOINTS 改成 min(MAXPINTS, iCount) ------> 这个不行吗?我都试过了,可以消除左上角与鼠标间的连线
Who_know_me 2008-10-12
  • 打赏
  • 举报
回复
楼上前辈说的办法还是不行~~
这是什么原因啊???
glacier3d 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jia_xiaoxin 的回复:]
最左上角与点鼠标的点之间画出一条线段呢,是因为画线的第一个点默认成(0,0)点了。
[/Quote]

不是第一个点吧?是最后一个
glacier3d 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Who_know_me 的回复:]

为什么画线的时候总是会在窗口的最左上角与点鼠标的点之间画出一条线段呢???

[/Quote]

原因就是我在3楼说的 ----- 〉在你记录的点数<1000的时候,最后画的一点的坐标是(0,0),改成我3楼说的那样就没事了
Who_know_me 2008-10-12
  • 打赏
  • 举报
回复
我的意思要像计算机自带的画图板上可以任意的画曲线,一开始不让它出现那一段线段。
你的代码在>1000个点就不能画曲线了~~
我昨天弄了一个下午,有点怀疑自己的能力了。
jia_xiaoxin 你能在尝试一下改改代码么??谢谢
Who_know_me 2008-10-12
  • 打赏
  • 举报
回复
你上面的代码结果跟我的是一样的~~
jia_xiaoxin 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Who_know_me 的回复:]
我试了还是不行~
为什么画线的时候总是会在窗口的最左上角与点鼠标的点之间画出一条线段呢???
前辈能不能再帮我改进一下代码,谢谢~~
[/Quote]

最左上角与点鼠标的点之间画出一条线段呢,是因为画线的第一个点默认成(0,0)点了。

我楼上的代码因该没有问题吧,你不断在屏幕上按着鼠标画点,当画到1000个的时候会调用WM_PAINT画出曲线,我已经调试过了。
Who_know_me 2008-10-12
  • 打赏
  • 举报
回复
怎么没人来帮看看呢???
zhekaiting1 2008-10-12
  • 打赏
  • 举报
回复
和你一样是初学者,是想进来找答案的!
Who_know_me 2008-10-12
  • 打赏
  • 举报
回复
我试了还是不行~
为什么画线的时候总是会在窗口的最左上角与点鼠标的点之间画出一条线段呢???
前辈能不能再帮我改进一下代码,谢谢~~
rcbblgy 2008-10-12
  • 打赏
  • 举报
回复
刚学了一点点,帮顶。
九桔猫 2008-10-12
  • 打赏
  • 举报
回复
楼主先试试画普通的线,离散点到平滑曲线是需要专门的方法
jia_xiaoxin 2008-10-12
  • 打赏
  • 举报
回复
帮你改了改

#include <windows.h> 
#define MAXPOINTS 1000

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

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Connect") ;
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 = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Connect-the-Points Mouse Demo"),
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 ;
PAINTSTRUCT ps ;
switch (message)
{
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON && iCount < 1000)
{
pt[iCount].x = LOWORD (lParam) ;
pt[iCount].y = HIWORD (lParam) ;
iCount++;

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

//
}

if(iCount >= 1000)
{
InvalidateRect (hwnd, NULL, TRUE) ;
ReleaseDC (hwnd, hdc) ;
}
break;

case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
Polyline (hdc, pt, MAXPOINTS) ;
EndPaint (hwnd, &ps) ;
break;

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

}
baihacker 2008-10-12
  • 打赏
  • 举报
回复
通过离散点来画曲线,需要一定的数学知识...在这里不能展开讲了.
glacier3d 2008-10-12
  • 打赏
  • 举报
回复
iCount 也别老递增,要不会溢出
glacier3d 2008-10-12
  • 打赏
  • 举报
回复
好像可以画线,不过我觉得最好把Polyline (hdc, pt, MAXPOINTS) 的MAXPOINTS改成min(MAXPINTS, iCount)
rollrock1987 2008-10-12
  • 打赏
  • 举报
回复
你自己不是实现了吗?

case WM_MOUSEMOVE:

if (wParam & MK_LBUTTON && iCount < 1000)

只是你在这里 加了一个条件 一定要在鼠标左键按下去的时候移动鼠标才可以画画

所以你可以把if (wParam & MK_LBUTTON && iCount < 1000) 去掉

移动鼠标看看
chlaws 2008-10-12
  • 打赏
  • 举报
回复
要画曲线直接进行响应鼠标移动

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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