盗贼王JING 发表于 2010-1-22 00:24:08

一个简单的窗体测试……

#include <windows.h>
#include<iostream>
using namespace std;
//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window&#39;s message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    PAINTSTRUCT ps;
    HDC hdc;
int    intX = HIWORD(lParam);
int   intY = LOWORD(lParam);
char temp;
    switch( msg )
    {
    case WM_PAINT:
      hdc = BeginPaint(hWnd, &ps);

      // TODO: 在此添加任意绘图代码...
      EndPaint(hWnd, &ps);
      break;
    case WM_DESTROY:
      PostQuitMessage( 0 );
      return 0;
      case WM_MOUSEMOVE:

    sprintf(temp,"X:%d,Y:%d",intX,intY);
SetWindowText(hWnd,temp);
      break;
      case WM_LBUTTONDOWN:
MessageBox(hWnd,"左键测试","标题",MB_OK);
            break;

      case WM_KEYDOWN:
            {
    switch(wParam)
    {
    case VK_F4:
      {
MessageBox(hWnd,"F4测试","标题",MB_OK);
      }
      break;
    }
            
            }
break;



    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
      GetModuleHandle(NULL), NULL, NULL, (HBRUSH)(COLOR_WINDOW+1), NULL,
      "Tutorial", NULL };
    RegisterClassEx( &wc );

    // Create the application&#39;s window
    HWND hWnd = CreateWindow( "Tutorial", "纯净窗口",
      WS_OVERLAPPEDWINDOW, 100, 100, 800, 600,
      NULL, NULL, wc.hInstance, NULL );

    // Show the window
    ShowWindow( hWnd, SW_SHOWDEFAULT );
    UpdateWindow( hWnd );

    // Enter the message loop
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);

    }

    UnregisterClass( "Tutorial", wc.hInstance );
    return 0;
}


=======================分割线====================

学了2个月才这么点东西……
底层的东西确实麻烦些,比起JAVA难学多了= =.
正在啃DXing.

这个代码 演示了一般窗口绘制。
有键盘(热键)鼠标 单击和移动事件(消息)的几个触发实例。

应该算是最省最省的代码了以后慢慢来= =学习道路好长……

shawind 发表于 2010-1-22 12:08:48

呵呵,对于写游戏来说,用winapi的地方主要就是个窗口。

哦,对了,那个消息循环我喜欢用这种写法。

for(;;)
{
   if(PeekMessage(&amp;msg,NULL,0,0,PM_REMOVE))
    {
        if (msg.message==WM_QUIT)
        {
            break;
        }
        else
        {
            TranslateMessage(&amp;msg);
            DispatchMessage(&amp;msg);
            continue;
        }
    }
}

至少是在我的机子上,如果用GetMessage的这种写法,创建窗口时,总是会让鼠标的光标短时间内变成沙漏的形状,会让人觉得这程序是不是在后台干什么构当了,很郁闷的感觉。

盗贼王JING 发表于 2010-1-23 00:37:52

引用第1楼shawind于2010-01-22 12:08发表的:
至少是在我的机子上,如果用GetMessage的这种写法,创建窗口时,总是会让鼠标的光标短时间内变成沙漏的形状,会让人觉得这程序是不是在后台干什么构当了,很郁闷的感觉。
.......

么错,用GetMessage会稍卡一些~
有更好的方法推荐么

tamashii 发表于 2010-1-26 13:10:04

循环其实可以用while(GetMessage(&amp;msg)){}的……
我认为还是这样好点

tamashii 发表于 2010-3-28 15:17:59

二楼写错了吧?
应该是 msg.wParam == WM_QUIT吧?

菲尔迦娜 发表于 2010-4-5 15:40:30

DX10的话是推荐这样做的


MSG msg = {0};
while( WM_QUIT != msg.message ) 

if( PeekMessage( &amp;msg, NULL, 0, 0, PM_REMOVE ) ) 

TranslateMessage( &amp;msg ); 
DispatchMessage( &amp;msg ); 

else 

Render();// Do some rendering 

}
页: [1]
查看完整版本: 一个简单的窗体测试……