我正在使用win32 API,这是我的代码(我已经从这个网站获得了一些帮助;))。
LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
RECT size;
int width;
char * widthHeight;
static char Swidth[32];
static char Sheight[32];
int height;
char sBottom[32];
char sTop[32];
char sLeft[32];
char sRight[32];
char SrightButtonClicked[32];
static int rightButtonClicked = 0;
char SleftButtonClicked[32];
static int leftButtonClicked = 0;
static bool LeftButtonClicked = false;
static bool RightButtonClicked = false;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
if(LeftButtonClicked == true)
{
SetDCPenColor(hdc, RGB(0, 0, 255));
LeftButtonClicked = false;
}
if(RightButtonClicked == true)
{
SetDCPenColor(hdc, RGB(255, 0, 0));
RightButtonClicked = false;
}
GetClientRect (hwnd, &rect);
GetWindowRect(hwnd, &size);
//Variables used in outputting.
width = size.right - size.left;
itoa(width, Swidth, 10);
height = size.bottom - size.top;
itoa(height, Sheight, 10);
itoa(rect.bottom, sBottom, 10);
itoa(rect.top, sTop, 10);
itoa(rect.left, sLeft, 10);
itoa(rect.right, sRight, 10);
//Line 1, Width and height output
TextOut(hdc, 0, 0, "Here is my width: ", 18);
TextOut(hdc, 125, 0, Swidth, 5);
TextOut(hdc, 175, 0, "Here is my height: ", 18);
TextOut(hdc, 300, 0, Sheight, 4);
//Line 2, Output the bottom, right, left, and top of the window
TextOut(hdc, 0, 20, sBottom, strlen(sBottom));
TextOut(hdc, 50, 20, sTop, strlen(sTop));
TextOut(hdc, 100, 20, sRight, strlen(sRight));
TextOut(hdc, 150, 20, sLeft, strlen(sLeft));
//Outputs the number of times right click has been clicked
TextOut(hdc, 0, 40, "Right Button Clicked: ", 23);
itoa(rightButtonClicked, SrightButtonClicked, 10);
TextOut(hdc, 150, 40, SrightButtonClicked, strlen(SrightButtonClicked));
//Output the number of times left click has been clicked
TextOut(hdc, 0, 60, "Left Button Clicked: ", 22);
itoa(leftButtonClicked, SleftButtonClicked, 10);
TextOut(hdc, 150, 60, SleftButtonClicked, strlen(SleftButtonClicked));
EndPaint (hwnd, &ps);
return 0;
case WM_LBUTTONDOWN:
leftButtonClicked++;
LeftButtonClicked = true;
InvalidateRect(hwnd, 0, true);
return 0;
case WM_RBUTTONDOWN:
rightButtonClicked++;
RightButtonClicked = true;
//Uses char * widthHeight to concat all the resolution into one char to output in Messagebox
widthHeight = new char[strlen(Swidth) + strlen(Sheight) + 4];
widthHeight = Swidth;
strcat(widthHeight, " x ");
strcat(widthHeight, Sheight);
//Has a message box pop up with resolution of window in Mouse Button OK format
MessageBox(NULL, widthHeight , "Right Mouse Button Pressed!", MB_OK);
InvalidateRect(hwnd, 0, true);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}
现在我想让它做一些像我点击颜色时更改文字颜色的东西..说红色?当我点击右键时,它会变成蓝色..我该怎么做呢?我已经google了很多东西,一切看起来都非常复杂。
答案 0 :(得分:0)
在开始输出之前尝试这个(在BeginPaint()调用工作之后):
// Set the Pen to Blue
SetDCPenColor(hdc, RGB(0,0,255));
要执行您想要的操作,只需在您在paint处理程序中检查的鼠标按下处理程序中设置一个值。如果没有设置[RGB(0,0,0)]则使用黑色,如果设置为黑色[RGB(0,0,255)]。
编辑:也不要使用静态hdc。每个人都想这样做,但它不起作用。 HDC实际上是由操作系统维护的,因此C ++将无法跟踪它。这最终是一个保证失败。在使用它之前,总是得到一个新的hdc(或任何名为DC的东西)。
编辑2:试试这个......
LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
RECT size;
int width;
char * widthHeight;
static char Swidth[32];
static char Sheight[32];
int height;
char sBottom[32];
char sTop[32];
char sLeft[32];
char sRight[32];
char SrightButtonClicked[32];
static int rightButtonClicked = 0;
char SleftButtonClicked[32];
static int leftButtonClicked = 0;
static bool LeftButtonClicked = false;
static bool RightButtonClicked = false;
static COLORREF pencolor = RGB(0,0,0); // Added by KRowe
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
SetDCPenColor(hdc, pencolor); // Added by KRowe
GetClientRect (hwnd, &rect);
GetWindowRect(hwnd, &size);
//Variables used in outputting.
width = size.right - size.left;
itoa(width, Swidth, 10);
height = size.bottom - size.top;
itoa(height, Sheight, 10);
itoa(rect.bottom, sBottom, 10);
itoa(rect.top, sTop, 10);
itoa(rect.left, sLeft, 10);
itoa(rect.right, sRight, 10);
//Line 1, Width and height output
TextOut(hdc, 0, 0, "Here is my width: ", 18);
TextOut(hdc, 125, 0, Swidth, 5);
TextOut(hdc, 175, 0, "Here is my height: ", 18);
TextOut(hdc, 300, 0, Sheight, 4);
//Line 2, Output the bottom, right, left, and top of the window
TextOut(hdc, 0, 20, sBottom, strlen(sBottom));
TextOut(hdc, 50, 20, sTop, strlen(sTop));
TextOut(hdc, 100, 20, sRight, strlen(sRight));
TextOut(hdc, 150, 20, sLeft, strlen(sLeft));
//Outputs the number of times right click has been clicked
TextOut(hdc, 0, 40, "Right Button Clicked: ", 23);
itoa(rightButtonClicked, SrightButtonClicked, 10);
TextOut(hdc, 150, 40, SrightButtonClicked, strlen(SrightButtonClicked));
//Output the number of times left click has been clicked
TextOut(hdc, 0, 60, "Left Button Clicked: ", 22);
itoa(leftButtonClicked, SleftButtonClicked, 10);
TextOut(hdc, 150, 60, SleftButtonClicked, strlen(SleftButtonClicked));
EndPaint (hwnd, &ps);
return 0;
case WM_LBUTTONDOWN:
leftButtonClicked++;
LeftButtonClicked = true;
pencolor = RGB(255,0,0); // Added by KRowe
InvalidateRect(hwnd, 0, true);
return 0;
case WM_RBUTTONDOWN:
rightButtonClicked++;
RightButtonClicked = true;
pencolor = RGB(0, 255,0); // Added by KRowe
widthHeight = new char[strlen(Swidth) + strlen(Sheight) + 4];
widthHeight = Swidth;
strcat(widthHeight, " x ");
strcat(widthHeight, Sheight);
//Has a message box pop up with resolution of window in Mouse Button OK format
MessageBox(NULL, widthHeight , "Right Mouse Button Pressed!", MB_OK);
InvalidateRect(hwnd, 0, true);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}