请教一个创建窗体的问题 - C++ Builder / Windows SDK/API
大家好:
请教一下,想在窗体中加入一个RichEdit的控件,用如下的方法创建后,不知道怎样去控制它,我想动态调整它的大小,取得它里面的东西。。。
hInst = LoadLibrary("riched20.dll");
HINSTANCE hInst;
TRect rect = Form1->ClientRect;
CreateWindowExA(0, "RichEdit20A", "aa", WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
|ES_WANTRETURN|ES_MULTILINE,
rect.left, rect.top, Form1->Width, Form1->Height-50,
Form1->Handle, 0, hInst,0);
先谢谢大家!!
[解决办法]
CreateWindowExA函数返回一个HWND句柄,你需要将这个句柄设成全局的,通过这个句柄来控制你创建的Rich20窗口.
[解决办法]
莫非你的代碼創建的時候出了問題沒有創建成功?
即便不是TRichEdit類型的也不該是空啊
h = CreateWindowExA(.....);//後面加上下面的代碼 看看什麽情況
TControl *ctr = FindControl(h);
if(ctr != NULL)
ShowMessage(ctr->ClassName()); //如果創建成功了 看看是什麽類型的
else
ShowMessage("NULL"); //走到這裡就説明create失敗了
[解决办法]
CreateWindowExA
返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。
http://blog.csdn.net/zjxsq/archive/2008/12/14/3516055.aspx
這裡有函數的詳細説明
你這個情況應該是這個函數失敗了
不管richEdit是什麽版本 縂應該是TControl類下的 用FindControl應該可以抓到
看看函數返回的是不是空
[解决办法]
//---------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HINSTANCE hInst;
HWND h;
TRect rect;
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hInst = LoadLibrary("riched20.dll");
rect = Form1->ClientRect;
h =CreateWindowExA(WS_EX_CLIENTEDGE, "RichEdit20A", "test",
WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|
WS_EX_CLIENTEDGE |ES_WANTRETURN|ES_MULTILINE |WS_EX_WINDOWEDGE,
rect.left, rect.top, rect.right, rect.bottom,
Form1->Handle, 0, hInst,0);
}
//---------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
// FreeLibrary(hInst);
}
//---------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
AnsiString st;
rect = Form1->ClientRect;
SetWindowPos(h, HWND_TOP, rect.left, rect.top, rect.right, rect.bottom-StatusBar1->Height,
SWP_FRAMECHANGED|SWP_SHOWWINDOW);
GetWindowText(h, st.c_str(), 255);
SendMessage(Form1->StatusBar1->Handle, SB_SETTEXT, 0, (int)st.c_str());
}
//---------------------------------------
[解决办法]
设置大小 SetWindowPos(
取得文本 GetWindowText(
这样不是就可以了?
[解决办法]
// Borland C++ Builder
// Copyright (c) 1995, 2005 by Borland Software Corporation
// All rights reserved
// (DO NOT EDIT: machine generated header) 'Classes.pas' rev: 10.00
#ObjectResourceToText(TStream* Input, TStream* Output, TStreamOriginalFormat &OriginalFormat)/* overload */;
extern PACKAGE void __fastcall ObjectTextToResource(TStream* Input, TStream* Output)/* overload */;
extern PACKAGE void __fastcall ObjectTextToResource(TStream* Input, TStream* Output, TStreamOriginalFormat &OriginalFormat)/* overload */;
extern PACKAGE TStreamOriginalFormat __fastcall TestStreamFormat(TStream* Stream);
extern PACKAGE bool __fastcall CheckSynchronize(int Timeout = 0x0);
extern PACKAGE void * __fastcall MakeObjectInstance(TWndMethod Method);
extern PACKAGE void __fastcall FreeObjectInstance(void * ObjectInstance);
extern PACKAGE HWND __fastcall AllocateHWnd(TWndMethod Method);
extern PACKAGE void __fastcall DeallocateHWnd(HWND Wnd);
}/* namespace Classes */
using namespace Classes;
#pragma pack(pop)
#pragma option pop
#pragma delphiheader end.
//-- end unit ----------------------------
#endif// Classes
[解决办法]
前面已经给了例子啊
可查一下BCB带的Win32 Programmer's Reference 帮助文件
void __fastcall TForm1::FormResize(TObject *Sender)
{
AnsiString st;
rect = Form1->ClientRect;
SetWindowPos(h, HWND_TOP, rect.left, rect.top, rect.right, rect.bottom-StatusBar1->Height,
SWP_FRAMECHANGED|SWP_SHOWWINDOW);
// 这个重新设置RichEdit的大小
GetWindowText(h, st.c_str(), 255); // 这个取得文本
SendMessage(Form1->StatusBar1->Handle, SB_SETTEXT, 0, (int)st.c_str());
}