#include<windows.h>
#include<stdio.h>
LRESULT CALLBACK WinProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance-----------
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WinProc;
wndclass.lpszClassName="shenhao";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wndclass);
HWND hwnd;
hwnd=CreateWindow("shenhao","加油",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
              CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
         TranslateMessage(&msg);
 DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
){   
HDC hdc;
    PAINTSTRUCT ps;
static  i=0;
    static  j=10;
static  k=0;
static  m=10;
switch(uMsg)
{
case WM_CREATE:
SetTimer(hwnd,1,100,NULL);
 
    
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
RECT rt;
        GetClientRect(hwnd,&rt);
if(i==0)
{
  Pie(hdc,100+j,100,150+j,150,150+j,100,150+j,150);
        }
else
{
          Pie(hdc,100+j,100,150+j,150,150+j,125,150+j,125);  
}
i=(i+1)%2;
if(j<rt.right-150)
{
j=(j+10)%1000;
}
 
EndPaint(hwnd,&ps); break;
case WM_KEYDOWN:

          switch(wParam)
  {
     
  case VK_LEFT:
              hdc=GetDC(hwnd);
      RECT rt1;
              GetClientRect(hwnd,&rt1);
         if(k==0)
 {
       Pie(hdc,100+j-m,100,150+j-m,150,100+j-m,150,100+j-m,100);
 }
     else
 {
              Pie(hdc,100+j-m,100,150+j-m,150,100+j-m,125,100+j-m,125);  
 }
 k=(k+1)%2;
 if(100+j-m<rt1.left)
 {
 m=(m+10)%1000;
 }
 ReleaseDC(hwnd,hdc);
  break;
  }
}
break;
case WM_TIMER:
    
        InvalidateRect(hwnd,NULL,TRUE);
break;
     case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

解决方案 »

  1.   

    while(GetMessage(&msg,NULL,0,0))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
    //加:while (GetMessage(&msg, NULL, 0, 0))
    {
    if (!TranslateAccelerator(ghwndApp, ghaccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    //当然 WinMain中:
    if (!(ghaccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDACCEL_ZOOMIN))))         return FALSE;
      

  2.   

    if (!TranslateAccelerator(ghwndApp, ghaccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);

    }
    //当然 WinMain中:
    if (!(ghaccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDACCEL_ZOOMIN)))) return FALSE;
    是什么意思啊?能帮我解释 解释吗?谢了  还有我把它们加上 错误提示是没有定义这又是怎么回事呢 谢谢啦
      

  3.   

    如果有资源,在资源中加"加速键"Accelerator。
    如果没有资源,用CreateAcceleratorTable
    //
    HACCEL CreateAcceleratorTable(
      LPACCEL lpaccl,  // pointer to structure array with accelerator data
      int cEntries     // number of structures in the array
    );
    //如:
    ACCEL acc;
    acc.fVirt=FVIRTKEY;
    acc.key=VK_LEFT;
    acc.cmd=2000;
    HACCEL ghaccelTable=CreateAcceleratorTable(&acc,1)//一个
      

  4.   

    //再仔细一点:
    1》先定义 命令ID:
    #define IDC_KEY_LEFT 2007
    其他键。
    2》WinMain中:
    //
    acc.fVirt=FVIRTKEY;
    acc.key=VK_LEFT;
    acc.cmd=IDC_KEY_LEFT;  ghaccelTable=CreateAcceleratorTable(&acc,1);//一个  while(GetMessage(&Message,0,0,0)) 
    {  // don't need if TTF_SUBCLASS
    //if(m_hToolTip) SendMessage(m_hToolTip, TTM_RELAYEVENT, 0, (LPARAM)&Message);
    if (!TranslateAccelerator(hParentWnd, ghaccelTable, &Message))
    {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
    }

    3》注意现在WM_KEYDOWN已被翻译成WM_COMMAND。所以要在:
    case WM_COMMAND: 
    if((wParam & 0xFFFF)==IDC_KEY_LEFT) 
    {//VK_LEFT
    OutputDebugString("haha");
    }
            break;
      

  5.   

    在WM_KEYDOWN中检测要派生子窗口。
    而使用加速键WM_COMMAND,父窗口要检测子窗口。
    都是麻烦事。
      

  6.   

    话都说到这份上了我就再现一把
    你自己结合代码好好想想吧
    #include<windows.h>
    #include<stdio.h>int nDirect = 0;LRESULT CALLBACK WinProc(
     HWND hwnd, // handle to window
     UINT uMsg, // message identifier
     WPARAM wParam, // first message parameter
     LPARAM lParam // second message parameter
     );int WINAPI WinMain(
       HINSTANCE hInstance, // handle to current instance
       HINSTANCE hPrevInstance, // handle to previous instance-----------
       LPSTR lpCmdLine, // command line
       int nCmdShow // show state
       )
    {
    WNDCLASS wndclass;
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hInstance=hInstance;
    wndclass.lpfnWndProc=WinProc;
    wndclass.lpszClassName="shenhao";
    wndclass.lpszMenuName=NULL;
    wndclass.style=CS_HREDRAW|CS_VREDRAW;
    RegisterClass(&wndclass);
    HWND hwnd;
    hwnd=CreateWindow("shenhao","加油",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);
    UpdateWindow(hwnd);
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return 0 ;
    }
    LRESULT CALLBACK WinProc(
     HWND hwnd, // handle to window
     UINT uMsg, // message identifier
     WPARAM wParam, // first message parameter
     LPARAM lParam // second message parameter
     ){   
    HDC hdc;
    PAINTSTRUCT ps;
    static int i = 0;
    static int nLeft = 0;
    static int nTop = 0;
    static int nStepX = 10;
    static int nStepY = 0;
    static int nOpenStartX = 50;
    static int nOpenEndX = 50;
    static int nOpenStartY = 0;
    static int nOpenEndY = 50;
    static int nCloseOffsetX = 50;
    static int nCloseOffsetY = 25;
    switch(uMsg)
    {
    case WM_CREATE:
    SetTimer(hwnd,1,100,NULL);
    case WM_PAINT:
    hdc=BeginPaint(hwnd, &ps); RECT rt;
    GetClientRect(hwnd, &rt);
    if(i==0)
    {
    Pie(hdc, nLeft, nTop, nLeft+50, nTop+50, nLeft+nOpenStartX, nTop+nOpenStartY, nLeft+nOpenEndX, nTop+nOpenEndY);
    }
    else
    {
    Pie(hdc, nLeft, nTop, nLeft+50, nTop+50, nLeft+nCloseOffsetX, nTop+nCloseOffsetY, nLeft+nCloseOffsetX, nTop+nCloseOffsetY);   
    }
    i=(i+1)%2; nLeft += nStepX;
    nTop += nStepY;
    if(nLeft > rt.right-50)
    nLeft = rt.right-50; if(nLeft < 0)
    nLeft = 0; if(nTop < 0)
    nTop = 0; if(nTop > rt.bottom-50)
    nTop = rt.bottom-50; EndPaint(hwnd,&ps); break;
    case WM_KEYDOWN:
    {   
    switch(wParam)
    {  
    case VK_RIGHT:
    {
    nStepX = 10;
    nStepY = 0;
    nOpenStartX = 50;
    nOpenEndX = 50;
    nOpenStartY = 0;
    nOpenEndY = 50;
    nCloseOffsetX = 50;
    nCloseOffsetY = 25;
    }break;
    case VK_LEFT:
    {
    nStepX = -10;
    nStepY = 0;
    nOpenStartX = 0;
    nOpenEndX = 0;
    nOpenStartY = 50;
    nOpenEndY = 0;
    nCloseOffsetX = 0;
    nCloseOffsetY = 25;
    }break;
    case VK_UP:
    {
    nStepX = 0;
    nStepY = -10;
    nOpenStartX = 0;
    nOpenEndX = 50;
    nOpenStartY = 0;
    nOpenEndY = 0;
    nCloseOffsetX = 25;
    nCloseOffsetY = 0;
    }break;
    case VK_DOWN:
    {
    nStepX = 0;
    nStepY = 10;
    nOpenStartX = 50;
    nOpenEndX = 0;
    nOpenStartY = 50;
    nOpenEndY = 50;
    nCloseOffsetX = 25;
    nCloseOffsetY = 50;
    }break;
    }
    }
    break;
    case WM_TIMER: InvalidateRect(hwnd,NULL,TRUE);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
    }