当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 关于win32 programming中的视口和窗口!

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 关于win32 programming中的视口和窗口!


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 288 ::
收藏到网摘: n/a

1 什么叫设备坐标,什么叫逻辑坐标?

言语无用,程序说话!

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     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 = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
    
     hwnd = CreateWindow (szAppName,                  // window class name
                          TEXT ("The Hello Program"), // window caption
                          WS_OVERLAPPEDWINDOW,        // window style
                          CW_USEDEFAULT,              // initial x position
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // parent window handle
                          NULL,                       // window menu handle
                          hInstance,                  // program instance handle
                          NULL) ;                     // creation parameters
    
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
    
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
      static int cxClient,cyClient;
     switch (message)
     {
               
     case WM_SIZE:
   cxClient = LOWORD(lParam);
   cyClient = HIWORD(lParam);
         return 0;
  case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
        
    SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);

    TextOut(hdc,0,0,TEXT("Hello,Windows 98!"),17);

          EndPaint (hwnd, &ps) ;
          return 0 ;
         
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

第一,TextOut函数是以逻辑坐标为单位的;

第二,SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);这条语句的字面

意思是把视口原点设在客户区的中央;

第三,事实是:文本将显示在客户区的中央;

结论:逻辑点(0,0)也被放在了中央。

把SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);这句换成:

SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2, NULL); 取得的效果与上句相同。

第一,此句的字面意思是:把窗口的原点设在(-cxClient/2,-cyClient/2) 上;

第二,其实字面意思太过于误导原意,什么狗屁窗口,视口,只要记住:

        SetWindowOrgEx使原来的X轴右移-cxClient/2,Y轴下移-cyClient/2

看这个:

       SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);

       SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);

看好了吧!!!