子窗口上下文菜单不能显示
wn61 2006-08-31 12:26:34 在用 win32 API 学习 windows 编程。想做一个简单的日记本:主窗体的左侧是一个 treeview 控件,显示日记目录,右侧是一个 richedit 控件,显示日记内容。想给 treeview 控件添加一个右键菜单,但是失败了。部分代码如下:
HMENU hMenu ;
int WINAPI WinMain( HINSTANCE hInstance, ... )
{
...
hInst = hInstance ;
...
}
LRESULT CALLBACK WndProc( ... )
{
...
switch( message )
{
case WM_CREATE :
...
hMenu = LoadMenu( hInst, TEXT("TreeViewMenu") ) ;
hMenu = GetSubMenu( hMenu, 0 ) ;
...
}
}
LRESULT CALLBACK TreeViewProc(...)
{
POINT point ;
switch( message )
{
case WM_RBUTTONDOWN :
point.x = LOWORD(lParam) ;
point.y = HIWORD(lParam) ;
ClientToScreen( hTreeView, &point ) ;
// 这里用 hTreeView 对吗?应该是 GetParent(hTreeView) ?
TrackPopupMenu( hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0,
GetParent(hTreeView), NULL ) ;
// 这里用 GetParent(hTreeView) 对吗?
break ;
...
}
}
上下文菜单属于主窗口还是子窗口?我把上面的几处 hTreeView 和 GetParent(hTreeView) 的几种组合都试了一下,还是不行。错在哪里?请指教。
还有几个小问题:
1.只使用 richedit 控件的时候,EM_CHANGE 消息有效,但是当我同时使用 treeview 控件的时候,每次重新激活窗口或者改变窗口大小都会产生一个 EM_CHANGE 消息,比如先最小化窗口再显示窗口。不知道原因,我只好在需要保存的时候将备份文本和richedit中的相比较,判断是否修改了文本。
2.下面是我读取 richedit 文本内容的代码:
int length = GetWindowTextLength( hEdit ) ;
PTSTR text = static_cast<PTSTR>(malloc((length+2) * sizeof(TCHAR))) ;
if( ! text )
{
outError( TEXT("Insuffcient memory available!") ) ;
return NULL ;
}
GetWindowText( hEdit, text, length + 1 ) ;
text[length+1] = TEXT('\0') ;
注意到里面奇怪的 length + 2 、length + 1 没有?只有这样才能正确读取。我哪里做错了?
3.vc6.0 的 fstream 是不是有 bug ? 我在用 它的 fstream 读取写入文件的时候,发现根本不行。对同一个文件做 读 -- 写 -- 读 ,我测试发现不行(每次读写完成后都要关闭文件)。用 bcc55 编译运行就可以。后来我只好用 fread、fwrite 重写了。
4.发现我的程序占用内存远远多于 editplus, 我测试发现好像只创建一个窗口占用的内存都不少,editplus 的空间效率怎么那么好?请大家指教。
5.如果用 C# 来完成效率应该高很多,但是 C# 可以编译成本机代码吗?