用Win32API怎么事先分割窗口,有现成的函数

 我来答
huanglenzhi
2017-12-19 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517195
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
* 在WIN32程序设计中不会出现MFC中那样现成的类与方法让你来“分割”窗口,如果要实现由你自己来绘制其中的“分隔条”并在同一窗体中处理好一个数据的两种数据表现。
* 在WIN32程序中如果想实现“文本编辑”也不难,有现成的窗口类,但同时要注意几点,一个是在注册窗类时直接使用WINDOWS提供的“Edit”类,再者就是你所创建的窗体中的风格一定要有WS_OVERLAPPEDWINDOWS及WS_VSCROLL或WS_HSCROLL风格。这样一来你就有了基本的“文本编辑”能力,但其它细节还要你来完成,如“滚动条”与视图的同步等等。
* 如果不这样你也可以创建自己的窗口类,并处理“文本编辑窗体”中的各个环节:下面写一个简单的示例。这里注册了自己的窗口类,并初步处理了一些基本的环节,使之具有一定的文本编辑能力。
#include "stdafx.h"
#define szRegWnd "MyRegWnd"//自定义窗口类
BOOL InitInstance(HINSTANCE ,int);
ATOM RegisterWnd(HINSTANCE);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LONG m_TextHeight; //字体高
LONG m_TextWidth; //字体宽
LONG m_TextMaxWidth; //字体最大宽度
char BufferChar[256]; //字符
LONG xCaretPos, yCaretPos; //光标位置
LONG nPos; //滑块位置
//WinMain函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
if(!hPrevInstance)
RegisterWnd(hInstance);
if(!InitInstance(hInstance, nCmdShow))
return -1;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//创建窗体
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND Init = CreateWindow(
szRegWnd,
"Edit Void",
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
0,
0,
640,
480,
NULL,
NULL,
hInstance,
NULL);
if(!Init)
return FALSE;
ShowWindow(Init, nCmdShow);
UpdateWindow(Init);
return TRUE;
}
//注册窗口类
ATOM RegisterWnd(HINSTANCE hInstance)
{
WNDCLASSEX wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)COLOR_BTNFACE;
wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
wc.hIcon = NULL;
wc.hIconSm = NULL;
wc.hInstance = hInstance;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.lpszClassName = szRegWnd;
wc.lpszMenuName = NULL;
wc.style = CS_GLOBALCLASS;
return RegisterClassEx(&wc);
}
//消息处理
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
//获得字体信息
TEXTMETRIC tm;
GetTextMetrics(GetDC(hWnd), &tm);
m_TextHeight = tm.tmHeight + tm.tmExternalLeading;
m_TextWidth = tm.tmMaxCharWidth;
m_TextMaxWidth = tm.tmMaxCharWidth + tm.tmAveCharWidth * 2;
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
case WM_CHAR://获得键盘字符
{
switch(LOWORD(wParam))
{
case VK_RETURN: break;
case VK_BACK: break;
default:
{
TextOut(GetDC(hWnd),
xCaretPos,
yCaretPos,
BufferChar,
wsprintf(BufferChar, "%c", (TCHAR)wParam)
);
SetCaretPos(xCaretPos + m_TextMaxWidth, yCaretPos);
}
}
}
break;
case WM_VSCROLL://滚动条处理
{
switch(LOWORD(wParam))
{
case SB_THUMBTRACK:
{
WORD pos = HIWORD(wParam);
nPos = pos;
SetScrollPos(hWnd, SB_VERT, pos, TRUE);
}
break;
case SB_LINEUP:
{
nPos > 0 ? nPos-- : nPos = 0;
SetScrollPos(hWnd, SB_VERT, nPos, TRUE);
}
break;
case SB_LINEDOWN:
{
nPos < 100 ? nPos++ : nPos = 100;
SetScrollPos(hWnd, SB_VERT, nPos, TRUE);
}
break;
}
}
break;
//键盘处理
case WM_KEYDOWN:
{
switch(LOWORD(wParam))
{
case VK_UP://移动字符光标
{
yCaretPos -= m_TextHeight;
SetCaretPos(xCaretPos, yCaretPos);
//向滚动条发送SB_LINEUP消息
SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);
}
break;
case VK_DOWN:
{
yCaretPos += m_TextHeight;
SetCaretPos(xCaretPos, yCaretPos);
//send msg
SendMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0L);
}
break;
case VK_LEFT:
{
xCaretPos -= m_TextWidth;
SetCaretPos(xCaretPos, yCaretPos);
}
break;
case VK_RIGHT:
{
xCaretPos += m_TextWidth;
SetCaretPos(xCaretPos, yCaretPos);
}
break;
case VK_RETURN://回车
{
yCaretPos += m_TextHeight;
xCaretPos = 0;
SetCaretPos(xCaretPos, yCaretPos);
}
break;
case VK_DELETE://删除
{
MessageBox(hWnd, "删除键\t", "测试", MB_ICONEXCLAMATION | MB_OK);
}
break;
case VK_BACK://后退
{
MessageBox(hWnd, "后退键\t", "测试", MB_ICONEXCLAMATION | MB_OK);
}
break;
case VK_INSERT://插入
{
MessageBox(hWnd, "插入键\t", "测试", MB_ICONEXCLAMATION | MB_OK);
}
break;
default:
{
xCaretPos += m_TextWidth;
}
break;
}
}
break;
case WM_SETFOCUS://光标caret控制
{
CreateCaret(hWnd, NULL, 1, m_TextHeight);//创建
SetCaretPos(0,0); //定位
ShowCaret(hWnd); //显示
}
break;
case WM_KILLFOCUS:
{
HideCaret(hWnd);
DestroyCaret();
}
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式