CAgt 发表于 2015-8-12 19:47:21

为什么调用WM_PAINT却在应用程序上显示不会出来?

#include <windows.h>
#include <tchar.h>
#include <wchar.h>
#define WINAPI __stdcall


//声明回调程序
LRESULT CALLBACK MyWndProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM Lparam);

const TCHAR szWindowsClass[] = TEXT("第一个窗口");
const TCHAR szWindowsTitle[] = TEXT("主窗口标题");

int WINAPI WinMain(HINSTANCE hInstance,
        HINSTANCE iPrevInsrance,
        LPTSTR lpCmdLine,
        int nCmdShow){

        WNDCLASSEX wnd = { 0 };
        wnd.cbSize = sizeof(WNDCLASSEX);
        wnd.style = CS_HREDRAW | CS_VREDRAW;
        wnd.lpfnWndProc = (WNDPROC)MyWndProc;
        wnd.cbWndExtra = 0;
        wnd.cbClsExtra = 0;
        wnd.hInstance = hInstance;   //引用程序实例句柄
        wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
        wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wnd.lpszClassName = szWindowsClass;
        RegisterClassEx(&wnd);

        //窗口创建
        HWND hWnd = CreateWindow(szWindowsClass,
                szWindowsTitle,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                HWND_DESKTOP, NULL,
                hInstance,NULL);
        if (!hWnd){
                MessageBox(NULL, TEXT("注册窗口创建失败."), TEXT("失败提示"), MB_OKCANCEL);
        }

        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);   
        /*
                消息循环
        */
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0)){
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam; //返回的是窗口参数
}
LRESULT CALLBACK MyWndProc(HWND wnd,
        UINT msg,
        WPARAM wParam,
        LPARAM Lparam){
        int mymsg = 0;
        switch (msg){
        case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;
        case WM_PRINT:{
                TCHAR * str = TEXT("Hello world!");
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(wnd, &ps);
                RECT r;
                GetClientRect(wnd, &r);
                SetTextColor(hdc, RGB(255, 0, 0));
                DrawText(hdc, str,-1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                TextOut(hdc, 2, 2, str, _tcslen(str));
                EndPaint(wnd, &ps);
                return 0;
        }
        /*case WM_NCPAINT:
        {
                WCHAR * str1 = TEXT("Hello world!";)
                HDC hdc;
                hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW | DCX_INTERSECTRGN);
                // Paint into this DC

                TextOut(hdc, 100, 100, str1, _tcslen(str));
                ReleaseDC(hwnd, hdc);
                return 1;
        }*/

        default:
                return DefWindowProc(wnd, msg, wParam, Lparam);
        }
}

智商是硬伤 发表于 2015-8-17 07:44:17

   {:7_146:}咱们码农有力量,嘿{:7_146:}

CAgt 发表于 2015-8-18 11:19:28

顶起来!!!!!

CAgt 发表于 2015-8-18 11:25:14

我怀疑消息队列中根本就没有收到输出内容的消息:cry:cry

SuperUser 发表于 2015-8-18 11:38:35

#include <windows.h>
#include <tchar.h>
#include <wchar.h>
#define WINAPI __stdcall


//声明回调程序
LRESULT CALLBACK MyWndProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM Lparam);

const TCHAR szWindowsClass[] = TEXT("第一个窗口");
const TCHAR szWindowsTitle[] = TEXT("主窗口标题");

int WINAPI WinMain(HINSTANCE hInstance,
        HINSTANCE iPrevInsrance,
        LPTSTR lpCmdLine,
        int nCmdShow){

        WNDCLASSEX wnd = { 0 };
        wnd.cbSize = sizeof(WNDCLASSEX);
        wnd.style = CS_HREDRAW | CS_VREDRAW;
        wnd.lpfnWndProc = (WNDPROC)MyWndProc;
        wnd.cbWndExtra = 0;
        wnd.cbClsExtra = 0;
        wnd.hInstance = hInstance;   //引用程序实例句柄
        wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
        wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wnd.lpszClassName = szWindowsClass;
        RegisterClassEx(&wnd);

        //窗口创建
        HWND hWnd = CreateWindow(szWindowsClass,
                szWindowsTitle,
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                HWND_DESKTOP, NULL,
                hInstance, NULL);
        if (!hWnd){
                MessageBox(NULL, TEXT("注册窗口创建失败."), TEXT("失败提示"), MB_OKCANCEL);
        }

        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
        /*
        消息循环
        */
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0)){
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam; //返回的是窗口参数
}
LRESULT CALLBACK MyWndProc(HWND wnd,
        UINT msg,
        WPARAM wParam,
        LPARAM Lparam){
        int mymsg = 0;
        switch (msg){
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        case WM_NCPAINT:{
                                          TCHAR * str = TEXT("Hello world!");
                                          PAINTSTRUCT ps;
                                          HDC hdc = BeginPaint(wnd, &ps);
                                          RECT r;
                                          GetClientRect(wnd, &r);
                                          SetTextColor(hdc, RGB(255, 0, 0));
                                          DrawText(hdc, str, -1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                                          TextOut(hdc, 2, 2, str, _tcslen(str));
                                          EndPaint(wnd, &ps);
                                          //MessageBox(NULL, TEXT("结束绘画"), TEXT("提示"), MB_OKCANCEL);
                                          return 0;
        }

        default:
                return DefWindowProc(wnd, msg, wParam, Lparam);
        }
}

楼主不知道窗口加载完才能绘画么:shock:
页: [1]
查看完整版本: 为什么调用WM_PAINT却在应用程序上显示不会出来?