#include<windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM MyWindowsClass(HINSTANCE hInstance);
HWND Create(HINSTANCE hInstance,int nCmdShow);
void MyDrawLine(HWND hwnd,HDC hdc);
int GetMousePos_x(int mousePos_x);
int GetMousePos_y(int mousePos_y);
int i = 1;
///////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DWORD dwTime = 1000, dwOldTime = 0;
MSG msg;
MyWindowsClass(hInstance);
HWND hWnd;
hWnd=Create(hInstance,nCmdShow);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
///////////////////////////////////////////////////////////////////
ATOM MyWindowsClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "MyFirstWindow";
wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
return RegisterClassEx(&wcex);
}
//////////////////////////////////////////////////////////////////////////////
HWND Create(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow("MyFirstWindow",
"my window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return hWnd;
}
////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int xBeg,yBeg,xEnd,yEnd;
PAINTSTRUCT ps;
int mousePos_x,mousePos_y;
int x[10000],y[10000];
x[0]=0;
y[0]=0;
HDC hdc;
char c[256];
//int x=100;
switch (message)
{
case WM_LBUTTONDOWN:
mousePos_x=LOWORD(lParam);
mousePos_y=HIWORD(lParam);
hdc=GetDC(hWnd);
x[i]=GetMousePos_x(mousePos_x);
y[i]=GetMousePos_y(mousePos_y);
//x=200;
//輸出滑鼠點的位置
//itoa(i,c,10);
//TextOut(hdc,100,200,c,strlen(c));
MoveToEx(hdc, 0, 0, NULL);
LineTo(hdc, x[2], y[2]);
itoa(x[2],c,10);
TextOut(hdc,100,200,c,strlen(c));
hdc=GetDC(hWnd);
i=i+1;
break;
//case WM_PAINT:
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int GetMousePos_x(int mousePos_x)
{
int a[10000];
a[i]=mousePos_x;
return a[i];
}
int GetMousePos_y(int mousePos_y)
{
int b[10000];
b[i]=mousePos_y;
return b[i];
}
目前達成了從(0,0)到滑鼠點擊的位置形成直線,現在的問題就是想接下來滑鼠再點一下,繼續從上一次結束的地方到新點擊的地方,問題就是點一次的滑鼠坐標值好像只能保存在當次滑鼠點擊的時候,下次點擊就重繪了,求問怎么達成這個效果啊
uj5u.com熱心網友回復:
改了
#include<windows.h>
#include <tchar.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM MyWindowsClass(HINSTANCE hInstance);
HWND Create(HINSTANCE hInstance, int nCmdShow);
void MyDrawLine(HWND hwnd, HDC hdc);
int GetMousePos_x(int mousePos_x);
int GetMousePos_y(int mousePos_y);
int i = 1;
///////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DWORD dwTime = 1000, dwOldTime = 0;
MSG msg;
MyWindowsClass(hInstance);
HWND hWnd;
hWnd = Create(hInstance, nCmdShow);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
///////////////////////////////////////////////////////////////////
ATOM MyWindowsClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = _T("MyFirstWindow");
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
return RegisterClassEx(&wcex);
}
//////////////////////////////////////////////////////////////////////////////
HWND Create(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(_T("MyFirstWindow"),
_T("my window"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return hWnd;
}
////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int xBeg, yBeg, xEnd, yEnd;
PAINTSTRUCT ps;
int mousePos_x, mousePos_y;
int x[10000], y[10000];
x[0] = 0;
y[0] = 0;
HDC hdc;
TCHAR c[256];
//int x=100;
switch (message)
{
case WM_LBUTTONDOWN:
mousePos_x = LOWORD(lParam);
mousePos_y = HIWORD(lParam);
hdc = GetDC(hWnd);
x[i] = GetMousePos_x(mousePos_x);
y[i] = GetMousePos_y(mousePos_y);
//x=200;
//輸出滑鼠點的位置
//itoa(i,c,10);
//TextOut(hdc,100,200,c,strlen(c));
MoveToEx(hdc, xBeg, yBeg, NULL);
LineTo(hdc, x[i], y[i]);
xBeg = x[i];
yBeg = y[i];
_itot_s(x[i], c, 10);
TextOut(hdc, 100, 200, c, _tcslen(c));
hdc = GetDC(hWnd);
i = i + 1;
break;
//case WM_PAINT:
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int GetMousePos_x(int mousePos_x)
{
int a[10000];
a[i] = mousePos_x;
return a[i];
}
int GetMousePos_y(int mousePos_y)
{
int b[10000];
b[i] = mousePos_y;
return b[i];
}
uj5u.com熱心網友回復:
思路是沒做任何操作之前,起點坐標和結束位置坐標重合,每次劃線完成以后,把結束位置的坐標賦予起點坐標,做下一次的起始坐標點如果只想界面顯示最后的一條線,繪制完直接重繪界面即可
顯示所有直線,可以把每次滑鼠按下和松開的倆個點保存到陣列中,在onpaint函式中回圈繪制所有點即可
uj5u.com熱心網友回復:
非常感謝!!!已經明白邏輯
uj5u.com熱心網友回復:
考慮 一下int a[10000];
a[i] = mousePos_x;
是不是
x[i] = mousePos_x;
int x[10000], y[10000];// 全域
int i = 1;// 0 ?
uj5u.com熱心網友回復:
你的繪圖操作最好放在陣列里面,繪圖操作只是從陣列里取資料繪制1、滑鼠點擊,將點添加保存到陣列,然后呼叫InvalidRect
2、在WM_PAINT里,使用陣列的資料繪圖
uj5u.com熱心網友回復:
自己寫的程式不知道邏輯,也是奇怪了。MoveToEx(hdc, xBeg, yBeg, NULL);
LineTo(hdc, x[i], y[i]);
xBeg = x[i];
yBeg = y[i];
_itot_s(x[i], c, 10);
這個是對的。
uj5u.com熱心網友回復:
目前為止,這個是唯一正確的方法。
uj5u.com熱心網友回復:
在WM_LBUTTONDOWN中,通過GetDC回傳一個HDC,在這個HDC上繪制的內容都是臨時的。視窗最小化再還原、被其它視窗擋住再移開、代碼中呼叫InvalidateRect重繪視窗后,都會導致原來繪制的內容被清空。只有在WM_PAINT在繪制的才能保留。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/85619.html
標籤:界面
上一篇:C語言下opencv的配置
