我做一个画图的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 
  还有:我怎么结帖?

解决方案 »

  1.   

    HDC hdc;
    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;
    }
      

  2.   

    要不给你个俄罗斯方块的程序看一下
    发个EMAIL过来
    揭贴点“管理”
      

  3.   

    我的意思是图能画出来,但选择颜色时,颜色填充不上,也就是程序不重画.如:
    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和移动鼠标时能画图,但松开鼠标后图象消失.
    我的问题是:怎么让程序选择颜色后图形能着上颜色.
    帮帮忙!!!!!!!
      

  4.   

    楼上的楼上这位大哥,能把俄罗斯方块的代码发给我看一下吗?
    谢了 [email protected]
      

  5.   

    You written so long code to me see.I not think anybody will see it.
      

  6.   

    能把俄罗斯方块的代码也发给我看一下吗?
    谢了 [email protected]