拈花小仙 发表于 2014-10-16 17:56:24

关于客户区坐标的问题

#include <Windows.h>
#include <iostream>
#include <tchar.h>

HINSTANCE g_hInstance;
HANDLE g_hStdOut;
PAINTSTRUCT ps;
HDC hdc;

LRESULT CALLBACK WndProc(HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    static int nX = 0,nY = 0;
    RECT rect;
    GetClientRect(hWnd,&rect);

    switch (uMsg)
    {
    case WM_KEYDOWN:
    {
      switch(wParam)
      {
      case VK_LEFT:
            {
                if(nX >= (rect.left + 10))
                {
                  nX -= 10;
                }
                InvalidateRect(hWnd,NULL,TRUE);
            }
            break;
      case VK_UP:
            {
                if( nY >= (rect.top + 10))
                {
                  nY -= 10;
                }
                InvalidateRect(hWnd,NULL,TRUE);
            }
            break;
      case VK_RIGHT:
            {
                if(nX <= (rect.right - 40)) //请帮我找找逻辑上的错误
                {
                  nX += 10;
                }
                InvalidateRect(hWnd,NULL,TRUE);
            }
            break;
      case VK_DOWN:
            {
                if(nY <= (rect.bottom - 21))//请帮我找找逻辑上的错误
                {
                  nY += 10;
                }
                InvalidateRect(hWnd,NULL,TRUE);
            }
            break;   
      }

    }
    case WM_PAINT:
    {
      hdc = BeginPaint(hWnd,&ps);

      TCHAR szText[] = TEXT("hello");;
      TextOut(hdc,nX,nY,szText,lstrlen(szText));

      EndPaint(hWnd,&ps);
      break;
    }
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

void RegisterWnd(LPCTSTR lpClassName)
{
    WNDCLASSEX wce;
    wce.style = CS_HREDRAW | CS_VREDRAW;
    wce.lpfnWndProc = WndProc;
    wce.cbSize = sizeof(WNDCLASSEX);
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hInstance = g_hInstance;
    wce.hIcon = 0;
    wce.hCursor = 0;
    wce.hIconSm = 0;
    wce.hbrBackground = HBRUSH(COLOR_BTNFACE + 1);
    wce.lpszClassName = lpClassName;
    wce.lpszMenuName = 0;
    if (!RegisterClassEx(&wce))
    {
      MessageBox(NULL, TEXT("注册失败"), TEXT("提示"), MB_OK);
    }

}

HWND CreateWnd(LPCTSTR lpClassName)
{
    HWND hWnd = CreateWindowEx(0, lpClassName, L"HELLO",
      WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
      CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);
    return hWnd;
}

void DisplayWnd(HWND hWnd)
{
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
}

void Message()
{
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
}

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR   lpCmdLine,
    int       nCmdShow)
{
    g_hInstance = hInstance;
    RegisterWnd(L"hello");
    HWND hWnd = CreateWnd(L"hello");
    DisplayWnd(hWnd);
    Message();
    return 0;
}

风之残月 发表于 2014-10-16 17:56:25

拈花小仙 发表于 2014-10-17 09:53
月月~我注释的那两行都是人工调的,说明我的算法逻辑有错误,客户区的各种上下左右稍调把我弄 ...

那就获得当前文本"hello"显示的长度和宽度,然后对坐标进行相应的增减

风之残月 发表于 2014-10-16 20:25:50

运行了一下,你的目的是什么?

拈花小仙 发表于 2014-10-17 09:53:31

风之残月 发表于 2014-10-16 20:25
运行了一下,你的目的是什么?

{:7_138:} 月月~我注释的那两行都是人工调的,说明我的算法逻辑有错误,客户区的各种上下左右稍调把我弄晕了~

拈花小仙 发表于 2014-10-17 11:25:26

风之残月 发表于 2014-10-17 10:39
那就获得当前文本"hello"显示的长度和宽度,然后对坐标进行相应的增减

{:7_145:}不会用哦

拈花小仙 发表于 2014-10-17 11:34:26

风之残月 发表于 2014-10-17 10:39
那就获得当前文本"hello"显示的长度和宽度,然后对坐标进行相应的增减

月月,这个算法有问题嘛?只是无法获取hello右下角坐标的问题嘛?

风之残月 发表于 2014-10-17 20:11:48

算法应该没有错,只是要计算"hello"这个字符串的宽度和高度,分别用于设置nx,ny,你可以去网上找找有没有相应的API

智商是硬伤 发表于 2015-8-26 08:15:58

{:7_146:}
页: [1]
查看完整版本: 关于客户区坐标的问题