我做一个画图的API程序,功能是:按住CTRL+点击鼠标,然后拖动鼠标,松开后画出一个矩形;按住SHIFT+点击鼠标,然后拖动鼠标,松开后画出一个圆。
我在其中加了个颜色菜单(红色,绿色,兰色),想点击其中一选项后,图形填充改颜色。我把画笔和画刷放到WM_COMMAND---->switch(wParam)---->IDM_RED 或 IDM_GREEN 或 IDM_BLUE下定义,在WM_PAINT中画图且刷新,结果不行。
麻烦你们给我看看问题出在哪儿?还有个程序最小化是的图标IDI_ICON1 和菜单IDR_MAINMENU。
// No2.cpp : Defines the entry point for the application.
//#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include "resource.h"HWND hWndMain;
RECT rect;LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );
BOOL InitWindowClass( HINSTANCE hInstance );
BOOL InitWindow( HINSTANCE hInstance ,int nCmdShow );int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
if(!InitWindowClass(hInstance))
return FALSE;
if(!InitWindow( hInstance , nCmdShow ))
return FALSE;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
BOOL InitWindowClass( HINSTANCE hInstance )
{
WNDCLASS Wndclass;
Wndclass.style = 0;
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 = "鼠标消息练习窗口类";
Wndclass.hIcon = LoadIcon(hInstance,(LPCTSTR)IDI_ICON1);
return RegisterClass(&Wndclass);
}BOOL InitWindow( HINSTANCE hInstance ,int nCmdShow )
{
HWND hWnd ;
HMENU hmenu;
hmenu=LoadMenu(hInstance,(LPCTSTR)IDR_MAINMENU);
hWnd = CreateWindow("鼠标消息练习窗口类",
"鼠标消息练习窗口",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
hmenu,
hInstance,
NULL);
if (!hWnd)
return FALSE;
hWndMain = hWnd;
ShowWindow(hWndMain, nCmdShow);
UpdateWindow(hWndMain);
return TRUE;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
HPEN hpen;
HBRUSH hbrush;
WORD x,y,wmID,wmEvent;
static BOOL yuan=FALSE,fang=FALSE; x=LOWORD(lParam);
y=HIWORD(lParam);
switch(message)
{
case WM_LBUTTONDOWN:
if(wParam&MK_CONTROL)//画矩形
{
yuan=FALSE;
fang=TRUE;
rect.top=x;
rect.left=y;
}
else if(wParam&MK_SHIFT)//画圆
{
yuan=TRUE;
fang=FALSE;
rect.top=x;
rect.left=y;
}
else
{
yuan=FALSE;
fang=FALSE;
}
break;
case WM_LBUTTONUP:
yuan=FALSE;
fang=FALSE;
rect.right=x;
rect.bottom=y;
break;
case WM_RBUTTONDOWN:
break;
case WM_RBUTTONUP:
break;
case WM_MOUSEMOVE: //运动鼠标后刷新
rect.right=x;
rect.bottom=y;
if(yuan==TRUE || fang==TRUE)
{
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
if(yuan==TRUE)
Ellipse(hdc,rect.left,rect.top,rect.right,rect.bottom);
if(fang==TRUE)
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
EndPaint(hwnd,&ps);
//InvalidateRect(hwnd,NULL,TRUE);
DeleteObject(hpen);
DeleteObject(hbrush); break;
case WM_COMMAND:
wmID=LOWORD(wParam);
wmEvent=HIWORD(wParam);
switch(wmID)
{
case IDM_RED:
hpen=CreatePen(PS_SOLID,2,RGB(255,0,0));
hbrush=CreateHatchBrush(HS_CROSS,RGB(0,100,0));
break;
case IDM_GREEN:
hpen=CreatePen(PS_SOLID,2,RGB(0,255,0));
hbrush=CreateHatchBrush(HS_CROSS,RGB(0,0,100));
break;
case IDM_BLUE:
hpen=CreatePen(PS_SOLID,2,RGB(0,0,255));
hbrush=CreateHatchBrush(HS_CROSS,RGB(1000,0,0));
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hwnd,message,wParam,lParam));
}
}这个是.rc文件//Microsoft Developer Studio generated resource script.
//
#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32/////////////////////////////////////////////////////////////////////////////
//
// Icon
//// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON DISCARDABLE "icon1.ico"#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//IDR_MAINMENU MENU DISCARDABLE
BEGIN
POPUP "文件"
BEGIN
MENUITEM "打开(&O)", IDM_OPEN
MENUITEM "关闭(&C)", IDM_CLOSE
END
POPUP "填充颜色"
BEGIN
MENUITEM "红色", IDM_RED
MENUITEM "绿色", IDM_GREEN
MENUITEM "兰色", IDM_BLUE
END
END#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
还有:我怎么结帖?
我在其中加了个颜色菜单(红色,绿色,兰色),想点击其中一选项后,图形填充改颜色。我把画笔和画刷放到WM_COMMAND---->switch(wParam)---->IDM_RED 或 IDM_GREEN 或 IDM_BLUE下定义,在WM_PAINT中画图且刷新,结果不行。
麻烦你们给我看看问题出在哪儿?还有个程序最小化是的图标IDI_ICON1 和菜单IDR_MAINMENU。
// No2.cpp : Defines the entry point for the application.
//#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include "resource.h"HWND hWndMain;
RECT rect;LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );
BOOL InitWindowClass( HINSTANCE hInstance );
BOOL InitWindow( HINSTANCE hInstance ,int nCmdShow );int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
if(!InitWindowClass(hInstance))
return FALSE;
if(!InitWindow( hInstance , nCmdShow ))
return FALSE;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
BOOL InitWindowClass( HINSTANCE hInstance )
{
WNDCLASS Wndclass;
Wndclass.style = 0;
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 = "鼠标消息练习窗口类";
Wndclass.hIcon = LoadIcon(hInstance,(LPCTSTR)IDI_ICON1);
return RegisterClass(&Wndclass);
}BOOL InitWindow( HINSTANCE hInstance ,int nCmdShow )
{
HWND hWnd ;
HMENU hmenu;
hmenu=LoadMenu(hInstance,(LPCTSTR)IDR_MAINMENU);
hWnd = CreateWindow("鼠标消息练习窗口类",
"鼠标消息练习窗口",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
hmenu,
hInstance,
NULL);
if (!hWnd)
return FALSE;
hWndMain = hWnd;
ShowWindow(hWndMain, nCmdShow);
UpdateWindow(hWndMain);
return TRUE;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
HPEN hpen;
HBRUSH hbrush;
WORD x,y,wmID,wmEvent;
static BOOL yuan=FALSE,fang=FALSE; x=LOWORD(lParam);
y=HIWORD(lParam);
switch(message)
{
case WM_LBUTTONDOWN:
if(wParam&MK_CONTROL)//画矩形
{
yuan=FALSE;
fang=TRUE;
rect.top=x;
rect.left=y;
}
else if(wParam&MK_SHIFT)//画圆
{
yuan=TRUE;
fang=FALSE;
rect.top=x;
rect.left=y;
}
else
{
yuan=FALSE;
fang=FALSE;
}
break;
case WM_LBUTTONUP:
yuan=FALSE;
fang=FALSE;
rect.right=x;
rect.bottom=y;
break;
case WM_RBUTTONDOWN:
break;
case WM_RBUTTONUP:
break;
case WM_MOUSEMOVE: //运动鼠标后刷新
rect.right=x;
rect.bottom=y;
if(yuan==TRUE || fang==TRUE)
{
InvalidateRect(hwnd,NULL,TRUE);
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
if(yuan==TRUE)
Ellipse(hdc,rect.left,rect.top,rect.right,rect.bottom);
if(fang==TRUE)
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
EndPaint(hwnd,&ps);
//InvalidateRect(hwnd,NULL,TRUE);
DeleteObject(hpen);
DeleteObject(hbrush); break;
case WM_COMMAND:
wmID=LOWORD(wParam);
wmEvent=HIWORD(wParam);
switch(wmID)
{
case IDM_RED:
hpen=CreatePen(PS_SOLID,2,RGB(255,0,0));
hbrush=CreateHatchBrush(HS_CROSS,RGB(0,100,0));
break;
case IDM_GREEN:
hpen=CreatePen(PS_SOLID,2,RGB(0,255,0));
hbrush=CreateHatchBrush(HS_CROSS,RGB(0,0,100));
break;
case IDM_BLUE:
hpen=CreatePen(PS_SOLID,2,RGB(0,0,255));
hbrush=CreateHatchBrush(HS_CROSS,RGB(1000,0,0));
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hwnd,message,wParam,lParam));
}
}这个是.rc文件//Microsoft Developer Studio generated resource script.
//
#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS/////////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32/////////////////////////////////////////////////////////////////////////////
//
// Icon
//// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON DISCARDABLE "icon1.ico"#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//IDR_MAINMENU MENU DISCARDABLE
BEGIN
POPUP "文件"
BEGIN
MENUITEM "打开(&O)", IDM_OPEN
MENUITEM "关闭(&C)", IDM_CLOSE
END
POPUP "填充颜色"
BEGIN
MENUITEM "红色", IDM_RED
MENUITEM "绿色", IDM_GREEN
MENUITEM "兰色", IDM_BLUE
END
END#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
还有:我怎么结帖?
PAINTSTRUCT ps;
TEXTMETRIC tm;
HPEN hpen;
HBRUSH hbrush;
WORD x,y,wmID,wmEvent;
static BOOL yuan=FALSE,fang=FALSE; x=LOWORD(lParam); //会不会是这里出错啊,我认为他们是不是应该放入sw 里面呢?
y=HIWORD(lParam);
switch(message)
{
case WM_LBUTTONDOWN:
if(wParam&MK_CONTROL)//画矩形
{
yuan=FALSE;
fang=TRUE;
rect.top=x;
rect.left=y;
}
发个EMAIL过来
揭贴点“管理”
case WM_COMMAND:
wmID=LOWORD(wParam);
wmEvent=HIWORD(wParam);
switch(wmID)
{
case IDM_RED:
hpen=CreatePen(PS_SOLID,2,RGB(255,0,0));
hbrush=CreateHatchBrush(HS_CROSS,RGB(0,100,0));
break;
这是点击红色选项时的画笔画刷.case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
if(yuan==TRUE)
Ellipse(hdc,rect.left,rect.top,rect.right,rect.bottom);
if(fang==TRUE)
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
EndPaint(hwnd,&ps);
//InvalidateRect(hwnd,NULL,TRUE);
DeleteObject(hpen);
DeleteObject(hbrush); break;
这是画图过程,因为在WM_MOUSEMOVE中已经有一个InvalidateRect(hwnd,NULL,TRUE),所以这里的InvalidateRect(hwnd,NULL,TRUE)去掉了,要不然按Ctrl或Shift和移动鼠标时能画图,但松开鼠标后图象消失.
我的问题是:怎么让程序选择颜色后图形能着上颜色.
帮帮忙!!!!!!!
谢了 [email protected]
谢了 [email protected]