windows sdk编程相关,请问如何在左键点击窗口后自动绘制一条直线?

二拾 2018-10-06 05:25:14
直线绘制没问题,但总是直接出现在屏幕上,怎么才能在左键点击后显示它呢?刚学windows编程,有很多不懂,如果有教程推荐就更好了。
...全文
267 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-10-16
  • 打赏
  • 举报
回复

Talk is cheap, show me the code!
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdio.h>
#include <windows.h>
int flag=0;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps;
HDC hdc;
RECT r;
HPEN hpen,op;

switch(message) {
case WM_CLOSE://按Alt+F4退出
PostQuitMessage(0);
break;
case WM_LBUTTONUP:
if (flag==0) {
flag=1;
InvalidateRect(hWnd,NULL,TRUE);
}
case WM_PAINT:
BeginPaint(hWnd, &ps);
hdc = ps.hdc; // the device context to draw in
GetClientRect(hWnd, &r); // Obtain the window's client rectangle
if (flag==1) {
hpen=CreatePen(PS_SOLID,0,0x00FF0000);
op=(HPEN)SelectObject(hdc,hpen);
MoveToEx(hdc,r.left+10,r.top+100,NULL);
LineTo(hdc,r.right-10,r.bottom-100);
SelectObject(hdc,op);
DeleteObject(hpen);
}
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
MSG msg = {0};
WNDCLASS wc = {0};
HBRUSH hbrh;
hbrh=CreateSolidBrush(0x00FFFFFF);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = hbrh;
wc.lpszClassName = "minwindowsapp";
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
if( FAILED(RegisterClass(&wc)) ) return 1;

if(FAILED(CreateWindow(wc.lpszClassName,
"Minimal Windows Application",
WS_SYSMENU|WS_CAPTION|WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
400,
300,
0,
0,
hInstance,
NULL)))
return 2;

while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
DispatchMessage( &msg );
}
DeleteObject(hbrh);
return 0;
}
lx624909677 2018-10-15
  • 打赏
  • 举报
回复
学会了基础的知识去写代码,由简单的开始,向难的写,就是深入浅出
二拾 2018-10-09
  • 打赏
  • 举报
回复
引用 7 楼 worldy的回复:
如果Resize窗口或其他窗口操作后,无需保留绘制后的直线,可以在WM_LBUTTONUP里绘制
否则,需要在LBUTTONDOWN时将绘制参数保存到一个数组(或其他数据结构),然后调用InvalidateRect,绘制操作统一在WM_PAINT里进行
明白了。这门课真的无聊,上课想睡书也看不进去,有什么深入浅出的教程么?
worldy 2018-10-08
  • 打赏
  • 举报
回复
如果Resize窗口或其他窗口操作后,无需保留绘制后的直线,可以在WM_LBUTTONUP里绘制
否则,需要在LBUTTONDOWN时将绘制参数保存到一个数组(或其他数据结构),然后调用InvalidateRect,绘制操作统一在WM_PAINT里进行
走好每一步 2018-10-08
  • 打赏
  • 举报
回复
孙鑫的 《VC++深入详解》,如果再想详细理解,侯捷的《深入浅出MFC》
不买书学的人是蠢蛋
赵4老师 2018-10-07
  • 打赏
  • 举报
回复
用一个全局变量记住是否绘制过直线。
schlafenhamster 2018-10-07
  • 打赏
  • 举报
回复
// case WM_LBUTTONDOWN:
// OutputDebugString("Main WM_LBUTTONDOWN\n");
// break;
case WM_LBUTTONDBLCLK:
// MessageBeep(110);
// break;

响应 消息
jacksonfan 2018-10-07
  • 打赏
  • 举报
回复
绘制之后没有清除,当然会一直显示
二拾 2018-10-06
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster的回复:
左键点击 ?点击 哪里 ? 按钮 ?
直接左键点窗口,然后让直线出现。
schlafenhamster 2018-10-06
  • 打赏
  • 举报
回复
左键点击 ?点击 哪里 ? 按钮 ?

16,471

社区成员

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

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

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