winapi中多行编辑中的意外行为

Posted

技术标签:

【中文标题】winapi中多行编辑中的意外行为【英文标题】:unexpected behaviour in multiline edit in winapi 【发布时间】:2018-01-27 15:48:35 【问题描述】:

我正在创建一个使用 c++ 中的 windows api 在多行编辑中绘制文本的程序。它由WM_PAINT 消息组成,该消息在客户区绘制文本,但插入符号在编辑中显示出意外行为。有时不打印字符,有时打印字符隐藏。

代码是

#define UNICODE
/*
**
**ALL HEADER FILES
**
*/
#include<wchar.h>
#include<windows.h>
#include <errno.h>
#include<conio.h>
#include<iostream>
#include<stdio.h>
#include<resource.h>
/*
**
**ALL DEFINES CONSTANT
**
*/
#define WINVER 0x0A00
#define _WIN32_WINNT 0x0A00
LRESULT CALLBACK WindowProcedure(HWND,UINT,WPARAM,LPARAM);
using namespace std;
HWND hwnd_handle;
HWND hw;
HINSTANCE his;
int WINAPI WinMain(HINSTANCE hvalue,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

his=hvalue;
/////com=nCmdShow;
LPWSTR myname=L"MY WINDOWS CLASS";
MSG msg=0;
WNDCLASSW wc;
wc.hbrBackground=(HBRUSH)COLOR_BTNFACE;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.lpszMenuName=NULL;
wc.lpszClassName=myname;
wc.hCursor=NULL;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.style=0;
wc.hInstance=hvalue;
wc.lpfnWndProc=WindowProcedure;
if(!RegisterClassW(&wc))

return 0;

///////main window
hwnd_handle=CreateWindowW(myname,L"CODE EDITOR",WS_OVERLAPPEDWINDOW,240,80,600,600,NULL, NULL,hvalue, NULL);
ShowWindow(hwnd_handle,nCmdShow);
UpdateWindow(hwnd_handle);
////////HWND hwnd=CreateWindowW(L"STATIC",L"CODE EDITOR",WS_OVERLAPPEDWINDOW,24,8,60,6,hwnd_handle, NULL,hInstance, NULL);
while(GetMessageW(&msg,NULL,NULL,NULL))

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

return 0;


LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg,WPARAM wParam,LPARAM lParam)

switch(msg)

case WM_CREATE:

/////main_structure(hwnd);
hw=CreateWindowW(TEXT("edit"),TEXT(""), WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL ,3,0,600,600,hwnd,NULL,his,NULL);

    break;

case WM_COMMAND:

/////menu_function(hwnd,wParam);


    break;


case WM_PAINT:

        PAINTSTRUCT ps;
        RECT info;
        HBRUSH hbrush;
        HDC hdc = BeginPaint(hw,&ps);
        wcout<<"vishal";
TextOut(hdc,20,20,L"vishak",6);
EndPaint(hw,&ps);

    break;


case WM_DESTROY:
PostQuitMessage(0);
break;

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


///////all men

【问题讨论】:

为什么在WM_PAINT 中有wcout?它不会在您的窗口上打印任何内容 这已经是您的 7 或 8 帐户了。可识别的编码风格和名称模式。问一个问题,然后创建一个新帐户来问一个类似的问题 @OP 在 Windows API 程序中尝试做非正统或“花哨”的事情需要对 Windows API 有很好的了解。否则,您只是在猜测如何实现您要实现的功能。与其猜测或试图成为试图找到橡子的盲猪,不如找到由经验丰富的 WinAPI 程序员编写的代码,或者从模仿你想要实现的 Windows API 书籍中找到。 这是一个公平的问题。但是你为什么要继续创建用户帐户?只需使用一个用户帐户。我不会花时间回答这个问题,因为您不太可能会阅读答案或接受答案。 【参考方案1】:

由于您使用编辑控件作为窗口的客户区,因此不要自己处理 WM_PAINT;而是将文本添加到编辑控件(使用带有 EM_SETTEXT 或可能 EM_REPLACESEL 的 SendMessage)并让它进行绘图。

此外,您应该处理 WM_SIZE 并将编辑控件设置为实际的客户区大小。

【讨论】:

以上是关于winapi中多行编辑中的意外行为的主要内容,如果未能解决你的问题,请参考以下文章

winapi创建多行文本框

WinAPI 中的编辑控件文本无法更改

WinAPI 库有命名空间吗?

如何使用 WinAPI 制作可编辑的文本框?

c ++ winapi - 子类化编辑控件 - 单击“Enter”时发出烦人的声音

如何更改静态文本控件(winapi)的字体?