怎么用vc控制一个tpagecontrol?
我手头上有个用borland c++写的程序,使用tpagecontrol的,里面有4个ttabsheet,我现在想用vc写个程序去控制ttabsheet的切换。试了半天不行。用
SendMessage(hWnd, PSM_SETCURSEL, 2, 0);
返回是203,好像tpagecontrol不是VC中的property sheet
应该怎么弄啊?
我的目的是要读出第3个ttabsheet中某个TEdit的内容,我发现用如果没有切换到第3个tabsheet,就无法找到这个TEdit的窗口,所以也就无法读出内容。
如果有其他方法能达到目的也行,多谢啦!
[解决办法]
先激活那个Edit的属性页,然后用Spy4win获取查找这个Edit的代码,
复制到你的程序中, 以后不必激活那个属性页就可以获取Edit了。
[解决办法]
下面是用gcc控制一个TPageControl,(偶没用过VC,惭愧)
#include <windows.h>
// 如果是BCB就不用定义了
#ifndef __BORLANDC__
#define TCN_FIRST (0U-550U) // tab control
#define TCM_FIRST 0x1300 // Tab control messages
#define TCM_SETCURSEL (TCM_FIRST + 12)
#define TCN_SELCHANGE (TCN_FIRST - 1)
#define CN_NOTIFY 0xbc4e
#endif
void ChangePageIdx(HWND hPage, int Value)
{
SendMessage(hPage, TCM_SETCURSEL, Value, 0); // 发送切换页面消息
NMHDR NMHdr;
NMHdr.code=TCN_SELCHANGE; // SendMessage(hPage, CN_NOTIFY, 0, (LPARAM)&NMHdr);提醒PageControl页面已切换
/*
* 因为&NMHdr与PageControl所在的程序不在同一地址空间,
* 所以要写到对方地址里去它才能读到NMHdr
*/
DWORD dwProcessID = 0;
::GetWindowThreadProcessId(hPage,&dwProcessID); // 找到对方线程ID
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID); // 打开线程,最大权限(设成写权限不行,不知何故)
if(hProcess==NULL) return;
LPVOID lpAddr = ::VirtualAllocEx
(hProcess,NULL,sizeof(NMHDR),MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 在对方地址申请空间
::WriteProcessMemory(hProcess,lpAddr,&NMHdr,sizeof(NMHDR),NULL); // 把NMHdr写进去
::SendMessage(hPage, CN_NOTIFY, 0, (LPARAM)lpAddr); // 忙活了半天终于可以发送这条消息了:)
::VirtualFreeEx(hProcess,lpAddr,0,MEM_RELEASE); // 帮对方收回空间
}
//---------------------------------------
// 以下是查找窗口 TPageControl 的代码:
// 在窗口标题不能确定的情况下可将标题设为NULL
HWND MyFindWindow()
{
const int MyMaxParentWinCount = 3;
// 父窗口类名数组
char *A_szClassName[MyMaxParentWinCount] =
{
"TForm1 ",
"TPanel ",
"TPageControl "
};
// 父窗口标题数组
char *A_szWinName[MyMaxParentWinCount] =
{
"Form1 ",
"Panel1 ",
" "
};
// 首先求得顶级父窗口
HWND hLastWin = FindWindow(A_szClassName[0], A_szWinName[0]);
// 逐次用FindWindowEx函数求出各级子窗口
for(int i=1; i <MyMaxParentWinCount; i++)
{
hLastWin = FindWindowEx(hLastWin, NULL,
A_szClassName[i], A_szWinName[i]);
}
return hLastWin;
}
// 举例: HWND hLastWin = MyFindWindow();
int main(int argc, char *argv[])
{
HWND hPage=MyFindWindow(); // 找到TPageControl的Handle,怎么找就看楼主自由发挥了,偶是用ccrun的Spy4Win找的,代码都是自动生成的,强啊~~(帮ccrun做下广告)
int Value=1; // 切换到第二页,0表示第一页
ChangePageIdx(hPage,Value);
system( "PAUSE ");
return EXIT_SUCCESS;
}