WM_PAINT难以被触发,怎样才能够让它重绘窗口

小弟刚学VC,这是我在写一个很小的五子棋项目。现在出现了一个问题就是点击鼠标以后窗口不刷新。
网上也去查了一些原因,大致确定是说WMPAINT消息优先级低,一直被忽略。。(当然我现在还不是很确定是不是这个原因)
嗯,我写的代码看起来比较复杂,大家将就一下:

这个是含WinMain的源文件:

 #include <tchar.h>

#include "gobang.h"

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define BOARD_GAP 20
#define CHESS_RADIUS 9
#define WINDOW_TITLE L"五子棋"

HDC g_hdc = NULL;
HDC g_mdc = NULL;
HBITMAP g_hBg = NULL;
HPEN g_hDrawer = NULL;
HBRUSH g_hBlkPainter = NULL;
HBRUSH g_hWhtPainter = NULL;

Processor *proc = NULL;

int g_iX = 0;
int g_iY = 0;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL Init(HWND hwnd);
BOOL Paint(HWND hwnd);
BOOL StepPaint(HWND hwnd, Point pt, BoardPointType bpt);
BOOL CleanUp(HWND hwnd);
INT GetCenterX(Point pt);
INT GetCenterY(Point pt);
Point MouseClassify();
BOOL CheckDistance(int x, int y);
VOID CheckMate(HWND hwnd, Point bp);
VOID Win(HWND hwnd, Player player);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    WNDCLASSEX wndClass = { 0 };
    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = hInstance;
    wndClass.hIcon = (HICON) ::LoadImage(NULL, L"src\\icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = L"Gobang";

    if (!RegisterClassEx(&wndClass))
        return -1;

    HWND hwnd = CreateWindow(L"Gobang", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);

    if (!Init(hwnd))
    {
        MessageBox(hwnd, L"资源初始化失败:计算机运行内存不足!", L"错误", 0);
        return FALSE;
    }

    if (wndClass.hIcon == NULL || g_hBg == NULL)
    {
        MessageBox(hwnd, L"资源初始化失败:素材缺失,请重新安装", L"错误", 0);
        return FALSE;
    }

    MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);
    ShowWindow(hwnd, nShowCmd);
    UpdateWindow(hwnd);

    MSG msg = { 0 };
    while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    UnregisterClass(L"Gobang", wndClass.hInstance);
    return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT paintStruct;

    switch (message)
    {
        /*case WM_TIMER:
            Paint(hwnd);
            break;*/

    case WM_PAINT:
        g_hdc = BeginPaint(hwnd, &paintStruct);
        Paint(hwnd);
        EndPaint(hwnd, &paintStruct);
        ValidateRect(hwnd, NULL);
        break;

    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
            DestroyWindow(hwnd);
        break;

    case WM_LBUTTONDOWN: {
            /*wchar_t temp[50];
            swprintf_s(temp, L"Mouse is at (%d, %d)", g_iX, g_iY);
            MessageBox(hwnd, temp, L"提示", 0);*/
            Point clickPoint = MouseClassify();
            if (clickPoint.x != 0)
            {
                //MessageBox(hwnd, L"Mouse Point caught", L"Debug", 0);
                if (proc->getPlayer() == PLAYER_BLACK)
                {
                    if (proc->Dip(clickPoint, PLAYER_BLACK))
                    {
                        StepPaint(hwnd, clickPoint, BLACK_CHESS);
                        //CheckMate(hwnd, Point{ clickPoint.x, clickPoint.y }, BLACK_CHESS);
                    }
                }
                else if (proc->getPlayer() == PLAYER_WHITE)
                {
                    if (proc->Dip(clickPoint, PLAYER_WHITE))
                    {
                        StepPaint(hwnd, clickPoint, WHITE_CHESS );
                        //CheckMate(hwnd, clickPoint, WHITE_CHESS );
                    }
                }
            }
            break;
    }
    case WM_MOUSEMOVE:
        g_iX = LOWORD(lParam);
        if (g_iX > WINDOW_WIDTH)
            g_iX = WINDOW_WIDTH;
        else if (g_iX < 0)
            g_iX = 0;

        g_iY = HIWORD(lParam);
        if (g_iY > WINDOW_HEIGHT)
            g_iY = WINDOW_HEIGHT;
        else if (g_iY < 0)
            g_iY = 0;
        break;

    case WM_DESTROY:
        CleanUp(hwnd);
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
        break;
    }

    return 0;
}

BOOL Init(HWND hwnd)
{
    g_hdc = GetDC(hwnd);
    g_mdc = CreateCompatibleDC(g_hdc);
    g_hBg = (HBITMAP)LoadImage(NULL, L"src\\bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE | LR_DEFAULTSIZE);
    g_hDrawer = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));   // black pen
    g_hBlkPainter = CreateSolidBrush(RGB(0, 0, 0)); // black brush
    g_hWhtPainter = CreateSolidBrush(RGB(255, 255, 255));

    proc = new Processor(9, 9);

    if (g_hdc == NULL || g_mdc == NULL || g_hBlkPainter == NULL || g_hWhtPainter == NULL || proc == NULL)
    {
        return FALSE;
    }

    //SetTimer(hwnd, 1, 100, NULL);

    //Game_Paint(hwnd);
    return TRUE;
}

BOOL Paint(HWND hwnd)
{
    SelectObject(g_mdc, g_hBg);
    BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);

    SelectObject(g_hdc, g_hDrawer);
    for (int i = 1; i < proc->getBoardWidth() + 1; i++)
    {
        MoveToEx(g_hdc, GetCenterX(Point{1, i}), GetCenterY(Point{1, i}), NULL);
        LineTo(g_hdc, GetCenterX(Point{ proc->getBoardHeight(), i}), GetCenterY(Point{ proc->getBoardHeight(), i }));
    }
    for (int i = 1; i < proc->getBoardWidth() + 1; i++)
    {
        MoveToEx(g_hdc, GetCenterX(Point{ i, 1}), GetCenterY(Point{ i, 1}), NULL);
        LineTo(g_hdc, GetCenterX(Point{i, proc->getBoardWidth() }), GetCenterY(Point{i, proc->getBoardHeight() }));
    }

    for (int i = 0; i < proc->getBoardWidth(); i++)
    {
        for (int j = 0; j < proc->getBoardHeight(); j++)
        {
            StepPaint(hwnd, Point{ i+1, j+1 }, proc->getBoardPointType(Point{i+1, j+1}));
        }
    }
    return TRUE;
}

BOOL StepPaint(HWND hwnd, Point pt, BoardPointType bpt)
{
    if (bpt== NO_CHESS)
    {
        return FALSE;
    }

    if (bpt == WHITE_CHESS)
    {
        SelectObject(g_hdc, g_hDrawer);
        SelectObject(g_hdc, g_hWhtPainter);
        Ellipse(g_hdc, GetCenterX(pt) - CHESS_RADIUS, GetCenterY(pt) - CHESS_RADIUS, GetCenterX(pt) + CHESS_RADIUS, GetCenterY(pt) + CHESS_RADIUS);
    }
    else
    {
        SelectObject(g_hdc, g_hDrawer);
        SelectObject(g_hdc, g_hBlkPainter);
        Ellipse(g_hdc, GetCenterX(pt) - CHESS_RADIUS, GetCenterY(pt) - CHESS_RADIUS, GetCenterX(pt) + CHESS_RADIUS, GetCenterY(pt) + CHESS_RADIUS);
    }
    return TRUE;
}

BOOL CleanUp(HWND hwnd)
{
    //KillTimer(hwnd, 1);
    DeleteDC(g_mdc);
    ReleaseDC(hwnd, g_hdc);
    return TRUE;
}

INT GetCenterX(Point pt)
{
    int scrctrx = WINDOW_WIDTH / 2;
    int midx = proc->getBoardWidth() / 2;
    return scrctrx - (midx - pt.x) * BOARD_GAP;
}

INT GetCenterY(Point pt)
{
    int scrctry = WINDOW_HEIGHT / 2;
    int midy = proc->getBoardHeight() / 2;
    return scrctry - (midy - pt.y) * BOARD_GAP;
}

Point MouseClassify()
{
    for (int i = 1; i < proc->getBoardWidth() + 1; i++)
    {
        for (int j = 1; j < proc->getBoardHeight() + 1; j++)
        {
            if (CheckDistance(GetCenterX(Point{ i, j}), GetCenterY(Point{i, j})))
            {
                return Point{i, j};
            }
        }
    }
    return Point{0, 0};
}

BOOL CheckDistance(int x, int y)
{
    int dx = g_iX - x;
    int dy = g_iY - y;
    return dx * dx + dy * dy < CHESS_RADIUS * CHESS_RADIUS;
}

VOID CheckMate(HWND hwnd, Point bp)
{
    /*if (Board_Check(g_board,bp))
    {
        Win(hwnd, currentPlayer);
    }*/
    MessageBox(hwnd, L"CheckMate not completed", L"Warning", 0);
}

VOID Win(HWND hwnd, Player player)
{
    //wchar_t msg[20] = (player == PLAYER_BLACK) ? L"Black Win!" : L"White Win!";
    if (player == PLAYER_BLACK)
    {
        MessageBox(hwnd, L"Black Win!", L"结束", 0);
    }
    else {
        MessageBox(hwnd, L"White Win!", L"结束", 0);
    }

    exit(0);
}

这个是引用的自己写的一个文件gobang.h:

 #ifndef _GOBANG_H_
#define _GOBANG_H_

#include <windows.h>

#define DEFAULT_BOARD_WIDTH 19
#define DEFAULT_BOARD_HEIGHT 19

enum BoardPointType
{
    NO_CHESS, BLACK_CHESS, WHITE_CHESS
};

enum Player
{
    PLAYER_BLACK, PLAYER_WHITE
};

typedef struct S_Point
{
    int x;
    int y;
} Point;

class Board
{
private:
    int w;
    int h;
    BoardPointType **bp;

public:
    Board();
    Board(int w, int h);

    int getW();
    int getH();

    BoardPointType getBoardPointType(Point pt);
};

class Processor
{
private:
    Board *board = NULL;
    bool vsCom;
    Player currentPlayer;

public:
    Processor();
    Processor(int bw, int bh);
    Processor(bool vsCom);
    Processor(int bw, int bh, bool vsCom);

    int getBoardWidth();
    int getBoardHeight();
    Player getPlayer();
    BoardPointType getBoardPointType(Point pt);

    BOOL Dip(Point pt, Player pl);
};

#endif // gobang.h

为什么运行之后不能够正常点一个点在上面。特别是调用了Ellipse(...)函数前后我看了,各项参数都是很正常的。。
每个参数是什么意思应该很好理解吧,我就不多解释了。proc是我定义的一个全局变量,用于对每个步骤进行响应。g_iX, g_iY是用来记录鼠标的位置。

编程环境:VS 2013

3个回答

下棋是鼠标点击事件不是窗体重绘事件

谢谢一楼的回答,虽然不是这个问题。我已经搞定了,只需要把WinMain里的Move, Show, Update函数放在Init函数之前就可以了。这一点我也没有想到为什么,不过还是谢谢了

单击鼠标并没有使窗口DC失效啊,所以当然不会触发了,你可以用鼠标左键按下的消息啊

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
求教WM_PAINT消息和非WM_PAINT消息下绘图的区别
小弟新学WIN32下的编程。对WM_PAINT消息下绘制图形和非WM_PAINT下绘图感到很困惑。不知道什么时候需要在WM_PAINT下绘图,什么时候收到消息后直接绘图。求教。
我是初学者想请教win32 api 关于使用WM_PAINT 谢谢
通过WM_LBUTTONDOWN WM_LBUTTONUP WM_PAINT 做出线段,怎么才能让他每次做出来之后不会刷新能保留下来?
direct2d怎么实现相对固定的时间 刷新游戏场景 而不是被迫接收到wm_paint消息后刷
比如gdi 可以写在消息循环里面 然后用gettickcount函数实现相对固定的时间刷新 但是direct2d貌似只能写在wm_paint消息里面 怎么实现这个功能呢 各位大神 谢谢
windows编程关闭窗口时进程还在后台运行
代码如下: ``` #include <Windows.h> #include <stdio.h> /* * 窗口的回调函数 */ LRESULT CALLBACK WindowProc(HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam) // second message parameter { HDC hDC; PAINTSTRUCT ps; switch (uMsg) { case WM_PAINT: /* * 窗口重绘时调用 * 只有在WM_PAINT消息中才可以使用BeginPaint、EndPaint * 其他消息使用GetDC、ReleaseDC */ hDC = BeginPaint(hwnd, &ps); TextOut(hDC, 0, 50, "这是在WM_PAINT消息中重绘的文字", strlen("这是在WM_PAINT消息中重绘的文字")); EndPaint(hwnd, &ps); break; case WM_CHAR: MessageBox(hwnd, "WM_CHAR消息触发了", "提示", MB_OK); break; case WM_LBUTTONDOWN: hDC = GetDC(hwnd); TextOut(hDC, 0, 70, "这是在WM_LBUTTONDOWN消息中重绘的文字", strlen("这是在WM_LBUTTONDOWN消息中重绘的文字")); ReleaseDC(hwnd, hDC); break; case WM_CLOSE: if (IDYES == MessageBox(hwnd, "确定要退出吗?", "提示", MB_YESNO)) { //确定退出,销毁窗口,抛出一个WM_DESTYRY的消息 DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } 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.style = CS_HREDRAW | CS_VREDRAW; //设置水平竖直重绘,发送WM_PAINT消息 wndclass.lpfnWndProc = WindowProc; //指定窗口的回调函数 wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; //两个额外数据 wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_CROSS); wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "myWindowClass"; //第二步、注册窗口类 RegisterClass(&wndclass); //第三步、创建窗口 HWND hWnd = CreateWindow( "myWindowClass", //窗口类的名字 "my first window", //窗口标题 WS_OVERLAPPEDWINDOW, //样式 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, //左上角坐标,宽高 NULL, //父窗口 NULL, //菜单 hInstance, //实例 NULL); //附加参数 //第四部、显示更新窗口 ShowWindow(hWnd, SW_SHOWNORMAL); //正常显示窗口 UpdateWindow(hWnd); //更新窗口 //第五步、消息循环 MSG msg; while (GetMessageA(&msg, hWnd, 0, 0)) { TranslateMessage(&msg); //翻译消息 DispatchMessageA(&msg); //将消息传入窗口的回调函数 } return 0; } ```
怎么强制其他程序的控件重绘。
我在做一个帮助程序,需要在其他程序的窗口上绘图(Graphics),但是只要这个窗口不重绘,我画的东西就一直在上面,所以我想强制他重绘,但是UpdateWindow,InvalIDAteRect,SendMessage(WM_PAINT)都没有用啊,有大佬知道怎么解决吗?
Invalidate重绘那个窗口的问题?
一个对话框dlg里面有一个自定义的Cmybutton类,请问下如果在Cmybutton的类下使用Invalidate函数,会发出WM_PAINT消息,这个消息能被主对话框捕获到吗?我理解是 invalidate是在Cmybuntton里面被调用的是不是就只有Cmybutton这个按钮才重绘呢? 对这些消息机制不是很懂,希望大神能讲下
处理WM_NCPAINT消息,用GetWindowDC获取窗口DC,为什么得到的窗口形状是圆角矩形
如图, ![图片说明](https://img-ask.csdn.net/upload/201703/27/1490626391_502.png) 我想处理WM_NCPAINT,实现自绘窗口边框。就算把整个窗口填满,得到的窗口形状为什么不是矩形,而是上面有两个圆角。如果让win8系统来绘制窗口,为什么又是没有圆角的矩形窗口? 求高手指点
求救!python3 pywin32 创建窗体没有 WM_CREATE 信息!
求救!python3 pywin32 创建窗体没有 WM_CREATE 信息! ``` def createPropertyWin(hWndParent = None): def wndProc(hWnd, message, wParam, lParam): print(message) if message == win32con.WM_PAINT: print("WM_PAINT") hdc, paintStruct = win32gui.BeginPaint(hWnd) dpiScale = win32ui.GetDeviceCaps(hdc, win32con.LOGPIXELSX) / 60.0 fontSize = 80 lf = win32gui.LOGFONT() lf.lfFaceName = "Times New Roman" lf.lfHeight = int(round(dpiScale * fontSize)) hf = win32gui.CreateFontIndirect(lf) win32gui.SelectObject(hdc, hf) rect = win32gui.GetClientRect(hWnd) win32gui.DrawText( hdc, '测试', -1, rect, win32con.DT_CENTER | win32con.DT_NOCLIP | win32con.DT_SINGLELINE | win32con.DT_VCENTER ) win32gui.EndPaint(hWnd, paintStruct) return 0 elif message == win32con.WM_CREATE: print("WM_CREATE") return 0 else: return win32gui.DefWindowProc(hWnd, message, wParam, lParam) hInstance = win32api.GetModuleHandle() className = 'MyCreatePropertyWin' wndClass = win32gui.WNDCLASS() wndClass.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW | win32con.CS_DBLCLKS wndClass.lpfnWndProc = wndProc wndClass.hInstance = hInstance wndClass.hCursor = win32gui.LoadCursor(None, win32con.IDC_ARROW) wndClass.hbrBackground = win32gui.GetStockObject(win32con.WHITE_BRUSH) wndClass.lpszClassName = className wndClassAtom = win32gui.RegisterClass(wndClass) exStyle = win32con.WS_EX_COMPOSITED | win32con.WS_EX_LAYERED | win32con.WS_EX_CLIENTEDGE style = win32con.WS_OVERLAPPEDWINDOW | win32con.CW_USEDEFAULT hWindow = win32gui.CreateWindowEx( exStyle, wndClassAtom, "属性", style, 0, 0, 300, 500, hWndParent, None, hInstance, None ) win32gui.ShowWindow(hWindow, win32con.SW_SHOWNORMAL) win32gui.UpdateWindow(hWindow) win32gui.PumpMessages() ```
WIN32编程断点无法命中WM_TIMER消息
在WIN32编程中,设置了定时器,我在WM_Timer消息中打上断点,却无法命中断点,是怎么回事? 大家看看我的代码有没有问题? ``` LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; int TIMER1 = 1; SYSTEMTIME st; static TCHAR str[50]; switch (message) { case WM_CREATE:SetTimer(hwnd, TIMER1, 100, NULL); return 0; case WM_PAINT: hdc = GetDC(hwnd); TextOut(hdc, 0, 0, str, 50); ReleaseDC(hwnd, hdc); return 0; case WM_TIMER: GetLocalTime(&st); GetTimeFormat(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, &st, "hh':'mm':'ss", str, 50); return 0; case WM_DESTROY: KillTimer(hwnd, TIMER1); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } ```
我是初学者想问win32 api的问题谢谢
用WM_LBUTTONDOWN与WM_LBUTTONUP 通过WM_PAINT如何画出一条线段 能具体点吗谢谢!
Win32消息,子窗口如何接受WM_KEYDOWN消息
我有一个主窗口,里面创建了一个子窗口。所有的操作其实都是为了对子窗口里的图片进行处理。但是一些控件如Button等放在主窗口。现在我想要这个子窗口处理我的PAGEUP和PAGEDOWN键盘消息,但是在主窗口的消息处理函数中可以接收到WM_KEYDOWN消息,而在子窗口中却不能接收到。我知道可以通过主窗口主动POST消息给子窗口实现,但是我想知道能不能直接在子窗口里接收消息。比如,主窗口放弃处理这个消息,并传递给子窗口。我对Windows的消息传递机制一直不是很清楚,希望有懂的大神简单讲解一下这个问题,非常感谢。 case WM_KEYDOWN: switch (wParam) { case VK_LEFT: // LEFT ARROW MessageBox(hWnd,"Left","Left", MB_YESNO); break; case VK_RIGHT: // RIGHT ARROW MessageBox(hWnd,"Right","Right", MB_YESNO); break; case VK_UP: // UP ARROW MessageBox(hWnd,"UP","UP", MB_YESNO); break; case VK_DOWN: // DOWN ARROW MessageBox(hWnd,"DOWN","DOWN", MB_YESNO); break; case VK_HOME: // HOME MessageBox(hWnd,"HOME","HOME", MB_YESNO); break; case VK_END: // END MessageBox(hWnd,"END","END", MB_YESNO); break; case VK_PRIOR: // PAGE UP MessageBox(hWnd,"PAGEUP","PAGEUP",MB_YESNO); break; case VK_NEXT: // PAGE DOWN MessageBox(hWnd,"PAGEDOWN","PAGEDOWN",MB_YESNO); break; default: break; } break;
WM_WINDOWPOSCHANGING消息中的WINDOWPOS->flags成员怎么清除相应位SWP_DRAWFRAME???
**WM_WINDOWPOSCHANGING消息备注:** 对于具有WS_OVERLAPPED或WS_THICKFRAME样式的窗口,DefWindowProc函数将WM_GETMINMAXINFO消息发送到窗口。 这样做是为了验证窗口的新大小和位置,并强制执行CS_BYTEALIGNCLIENT和CS_BYTEALIGNWINDOW客户端样式。 通过不将WM_WINDOWPOSCHANGING消息传递给DefWindowProc函数,应用程序可以覆盖这些默认值。 在处理此消息时,修改WINDOWPOS中的任何值会影响窗口在Z顺序中的新大小,位置或位置。应用程序可以通过设置或清除WINDOWPOS的flags成员中的相应位来阻止对窗口的更改。 **WINDOWPOS结构成员flags描述** flags 类型:UINT 该成员可以是以下一个或多个值。 值 含义 SWP_DRAWFRAME 0×0020 在窗口周围绘制一个框架(在窗口的类描述中定义)。与SWP_FRAMECHANGED标志相同。 SWP_FRAMECHANGED 0×0020 即使窗口的大小未更改,也会向窗口 发送WM_NCCALCSIZE消息。如果未指定此标志,则仅在更改窗口大小时发送WM_NCCALCSIZE。 ``` case WM_NCCALCSIZE:return 0; case WM_WINDOWPOSCHANGING: { WINDOWPOS *pos = (LPWINDOWPOS)lParam; pos->flags;//怎么清除相应位SWP_DRAWFRAME??? return 0; } ``` WM_NCCALCSIZE消息返回0后可以无边框,但是最大化时会发生位移 不正常(-8, -8)-(1374, 776), 1382x784 (最大化) 正常(0,0)-(1366,768)(最大化) 清除相应位SWP_DRAWFRAME后应该就可以实现正常,但怎么实现???
计时器消息会因为重绘消息停止?
不知道为什么拖动边框或者最大最小化会使定时器停止,求解释消息的机制,萌新求解释┭┮﹏┭┮ LRESULT CALLBACK wndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { PAINTSTRUCT paintStruct; switch (message) { case WM_TIMER: Game_Paint(hwnd); return 0; case WM_PAINT: g_hdc = BeginPaint(hwnd,&paintStruct); Game_Paint(hwnd); EndPaint(hwnd,&paintStruct); ValidateRect(hwnd,NULL); return 0; case WM_KEYDOWN: if (wparam == VK_ADD) { DestroyWindow(hwnd); }return 0; case WM_DESTROY: Game_Cleanup(hwnd); PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd,message,wparam,lparam); } } ``` ```
MFC向其他程序发送wm_command消息失败
MFC 点击按钮向其他程序发送wm_command消息, _点击按钮发送后,要移动一下鼠标或键盘按一下键,才会发出消息,目标窗口才会做出响应, 请问是怎么回事,要怎么解决. 如果鼠标不动,消息发不出来.目标窗口没反应 ``` HWND hwnd_sj = ::FindWindow(NULL,L"数据下载"); SendMessage(hwnd_sj,WM_COMMAND,0x0abe1, 0); return; ``` 用网上下载的消息调试器发送成功
为什么win32在WM_CLOSE消息中直接调用PostQuitMessage(0)窗口无法退出?在拖动窗口后点击又可以退出了?
我知道直接用PostQuitMessage结束消息循环会导致内存泄漏,应该在WM_CLOSE中用DestroyWindow发送WM_DESTROY之后再用PostQuitMessage, 但我想知道为什么我在使用消息循环1时直接在WM_CLOSE下用PostQuitMessage(0)窗口为什么无法退出,并且在拖动窗口后再点击退出就行了。而在使用消息循环2时点击能直接退出。 消息循环1: while (bRet = GetMessage(&msg, MainWnd, 0, 0)) { if (-1 == bRet) break; TranslateMessage(&msg); DispatchMessage(&msg); } 消息循环2: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } (使用的编译器是vs2017)
新手用MFC求教,在咋们CSDN上搜到一个程序刚好我要用,收拾了一堆出错后剩下这个求教。
{WM_NULL,"WM_NULL"}, {WM_CREATE,"WM_CREATE"}, {WM_DESTROY,"WM_DESTROY"}, {WM_MOVE,"WM_MOVE"}, {WM_SIZE,"WM_SIZE"}, {WM_ACTIVATE,"WM_ACTIVATE"}, {WM_SETFOCUS,"WM_SETFOCUS"}, {WM_KILLFOCUS,"WM_KILLFOCUS"}, {WM_ENABLE,"WM_ENABLE"}, {WM_SETREDRAW,"WM_SETREDRAW"}, {WM_SETTEXT,"WM_SETTEXT"}, {WM_GETTEXT,"WM_GETTEXT"}, {WM_GETTEXTLENGTH,"WM_GETTEXTLENGTH"}, {WM_PAINT,"WM_PAINT"}, {WM_CLOSE,"WM_CLOSE"}, {WM_QUERYENDSESSION,"WM_QUERYENDSESSION"}, {WM_QUIT,"WM_QUIT"}, 后半部分全是波浪线 出错提示: 1>e:\pjb\messagetip\messagetip\stdafx.h(71): error C2440: “初始化”: 无法从“const char [8]”转换为“LPCTSTR” 1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换 1>e:\pjb\messagetip\messagetip\stdafx.h(72): error C2440: “初始化”: 无法从“const char [10]”转换为“LPCTSTR” 1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换 1>e:\pjb\messagetip\messagetip\stdafx.h(73): error C2440: “初始化”: 无法从“const char [11]”转换为“LPCTSTR” 1> 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换 1>e:\pjb\messagetip\messagetip\stdafx.h(74): error C2440: “初始化”: 无法从“const char [8]”转换为“LPCTSTR”
使用wm_concat导致的性能问题
sql类似如下 select a.name wm_concat(a.c1), wm_concat(a.c2), wm_concat(a.c3) from table a group by a.name 这里要按名称分组将其他三个值都拼接起来,返回的都是clob类型,导致查询非常慢 而且占用相当大的表空间。。。请教大神,这要如何优化?a.c1等拼接的值很容易超过 4000。。。
结构体定义的问题,求大神帮忙解释下第二个结构体的含义,谢谢了!
struct MSGMAP_ENTRY { UINT nMessage; LONG (*pfn)(HWND,UINT,WPARAM,LPARAM); }; struct MSGMAP_ENTRY _messageEntries[] = { WM_CREATE, OnCreate, WM_PAINT, OnPaint, WM_SIZE, OnSize, WM_COMMAND, OnCommand, WM_SETFOCUS, OnSetFocus, WM_CLOSE, OnClose, WM_DESTROY, OnDestroy, } ; 求大神帮我解释下第二个结构体的含义吗?谢谢了!
SetWindowsHookEx 截获不到WM_COPYDATA
SetWindowsHookEx 截获不到WM_COPYDATA 代码是写在DLL中的,钩子也成功了,但截不到 LRESULT CALLBACK MYWNDPROC(int code, WPARAM wParam, LPARAM lParam) { COPYDATASTRUCT * pCopyData; if(code==HC_ACTION) { CWPSTRUCT *pMsg = (CWPSTRUCT *)lParam; if(pMsg->message==WM_COPYDATA) 截不到WM_COPYDATA,但SPY++可以,求教。
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
五年程序员记流水账式的自白。
不知觉已中码龄已突破五年,一路走来从起初铁憨憨到现在的十九线程序员,一路成长,虽然不能成为高工,但是也能挡下一面,从15年很火的android开始入坑,走过java、.Net、QT,目前仍处于android和.net交替开发中。 毕业到现在一共就职过两家公司,目前是第二家,公司算是半个创业公司,所以基本上都会身兼多职。比如不光要写代码,还要写软著、软著评测、线上线下客户对接需求收集...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
一文详尽系列之模型评估指标
点击上方“Datawhale”,选择“星标”公众号第一时间获取价值内容在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
还记得那个提速8倍的IDEA插件吗?VS Code版本也发布啦!!
去年,阿里云发布了本地 IDE 插件 Cloud Toolkit,仅 IntelliJ IDEA 一个平台,就有 15 万以上的开发者进行了下载,体验了一键部署带来的开发便利。时隔一年的今天,阿里云正式发布了 Visual Studio Code 版本,全面覆盖前端开发者,帮助前端实现一键打包部署,让开发提速 8 倍。 VSCode 版本的插件,目前能做到什么? 安装插件之后,开发者可以立即体验...
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
2019年除夕夜的有感而发
天气:小雨(加小雪) 温度:3摄氏度 空气:严重污染(399) 风向:北风 风力:微风 现在是除夕夜晚上十点钟,再有两个小时就要新的一年了; 首先要说的是我没患病,至少现在是没有患病;但是心情确像患了病一样沉重; 现在这个时刻应该大部分家庭都在看春晚吧,或许一家人团团圆圆的坐在一起,或许因为某些特殊原因而不能团圆;但不管是身在何处,身处什么境地,我都想对每一个人说一句:新年快乐! 不知道csdn这...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问