大问题,又是300分,快来抢啊! 自己在CQuoteGrid中添加一个CEdit控件,在适当的时候创建(不显示),在需要编辑的时候显示编辑控件,设置大小,内容,在编辑结束之后返回修改结果。简单点可以E我:[email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,好像没太好的办法。自己从 CEdit 派生一个 CMyEdit 然后再 SubClassWindow 也不行,估计那个 Edit 的 WindowProc 是特殊的,不让你随便改变窗口大小;SetWindowText 却可以。自己做吧,我就是这样做的。从 CEdit 派生出自己的类 CMyEdit,要处理的消息有:WM_KILLFOCUS 用 SendMessage 向父窗口(AppWizard 创建的 CListView 派生类)发送一个自定义消息,通知父窗口编辑结束;父窗口收到消息后改变相应 List Item,用 SetListItem。WM_CHAR 如果是 VK_RETURN/VK_TAB(或其他你认为比较特殊的),得到父窗口,把焦点转移过去,这样就自动触发上面的 OnKillFocus 处理;如果是 VK_ESCAPE,就隐藏窗口。在 CListView 类中,处理 NM_CLICK 通知消息,在适当的位置显示你的 CMyEdit 窗口;重载 WindowProc 以截获自定义消息。还有有很多细节问题,好好研究,很有意思。我可提供源程序,不过很复杂;可以给我 email 索要。 如此说来,是瘪盖子的错了?SetWindowText、GetWindowText都可以。GetWindowLong、SetWindowLong改其风格也可以,但改动窗口大小、位置的都不行。过份!现在虽然很好用,但是编辑的时候有点不够美观。有没有简单的方法?复杂的方法一概不要! 完全可以啊,不可能不行的。不知道你是如何做的,但是在BCG的代码中可以实现这个功能。其代码如下:BOOL CBCGEditListBox::EditItem(int iIndex){....CEdit * pEdit=m_wdnList.EditLable(iIndex);CRect rectClient;GetClientRect(rectClient);CRect recEdit;pEdit->GetClientRect(rectEdit);pEdit->SetWindowPos(NULL,-1,-1,rectClient.Width()-10,rectEdit.Height(),SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);return TRUE;}更详细的内容你可以去下载一个BCG的类库来研究一下。www.codetools.com中有。 Wingsun,你真是个高手,以后还请多多赐教!谢谢! Wingsun,你真是个高手,以后还请多多赐教!不过你的方法还是有问题,虽然刚激活时好像可以,但输入时就变了,和以前一样! 自已从CEdit类派生一个子类 CMyEdit,在该类中处理 WM_SIZE消息。因为原来的编辑控件每接收到一个字符后,就重新设置大小,所以前面各位提供的方法只能在激活的时候改变窗口大小,输入时就变了。因此应该在WM_SIZE消息处理函数中改变窗口大小。// 在每次开始编辑的时候,子类化编辑控件// m_cEdit 是 CTestDlg的一个成员变量,类型是 CMyEdit.void CTestDlg::OnBeginlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult) { m_cEdit.SubclassWindow( m_cList.GetEditControl()->m_hWnd ); *pResult = 0;}/* WM_SIZE 消息处理函数如下:*/void CMyEdit::OnSize(UINT nType, int cx, int cy) { static int cx1 = 80; static int cy1 = 16; // as you like if( cx!=cx1 || cy!=cy1 ) // 防止循环调用 SetWindowPos(NULL, 0,0, cx1, cy1, SWP_NOZORDER|SWP_NOMOVE ); CEdit::OnSize(nType, cx, cy);} 大侠们啊,能不能提供真正有用的方法来?我希望的是直接应用CListCtrl本身提供的Edit,如果是自己派生的我就没必要跑到这来问了,我自己就有这样的代码。拜托各位了,300分呢! 我试验了一下,可以实现你的要求,不知你自己觉得是否麻烦,如下:一句话,就是替换原来的窗口函数:WNDPROC pOld = NULL; // 保存原来的窗口函数LRESULT CALLBACK EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ if (message == WM_WINDOWPOSCHANGING) { LPWINDOWPOS lpwp = (LPWINDOWPOS)lParam; lpwp->cx = 200; // 自己的大小 lpwp->cy = 100; return 0; } else return CallWindowProc(pOld, hWnd, message, wParam, lParam);}void CAaaDlg::OnBeginlabeleditList(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; // TODO: Add your control notification handler code here CEdit *pEdit = m_list.GetEditControl(); pOld = (WNDPROC)::SetWindowLong(pEdit->m_hWnd, GWL_WNDPROC, (LONG)EditProc); *pResult = 0;} 我有兴趣,e-mail:[email protected] 在 OnBeginLabelEditList 里面用 SetWindowPos 之类的函数没用,因为每敲一个字符,都要重新定大小。 呵呵。BlackSword还不想从CEdit派生新类。其实,这种方法不复杂呀。下面再说一种方法:假设CQuoteGrid是CListCtrl的一个派生类,并重载其虚函数OnCommand。BOOL CQuoteGrid::OnCommand(WPARAM wParam, LPARAM lParam) { CEdit* pEdit = GetEditControl(); if( pEdit != NULL && lParam == (long)pEdit->m_hWnd ) { if(HIWORD(wParam)==EN_CHANGE||HIWORD(wParam)==EN_SETFOCUS) { pEdit->SetWindowPos(NULL,0,0,80,16,SWP_NOZORDER|SWP_NOMOVE); pEdit->SetSel( pEdit->GetSel() ); // 设置光标 } } return CListCtrl::OnCommand(wParam, lParam);}我试过,两种方法都可以实现。你要是再嫌麻烦的话,我也没办法了。 wuxin同志的办法虽然有闪烁现象,但毕竟接近实现了,给200分先。其它的大家分,你没意见吧? 64位的MFC开发需要注意哪些内容? 一个小项目如何进行系统设计,类的划分,请高手指教 我的第一个问题 MFC里Dialog重绘 如何修改SD对话框的图片 关于message handler问题! 关于视口和窗口! 关于编辑框每行输入字符数限制 在VC + ODBC + SQL 7.0的开发中,为什么我无法锁住记录? 开始看programming windows的英文版,中文版实在找不到,有些句子不太理解,大家请看看 iceberg:CELL似乎不支持ACCESS2000;有地方升级吗?ACCESS97很难找。。。 谁能帮帮我:哪位高手用VC进行过BMP转换成GIF的编程,帮我指点一下?
自己从 CEdit 派生一个 CMyEdit 然后再 SubClassWindow 也不行,估计那个 Edit 的 WindowProc 是特殊的,不让你随便改变窗口大小;SetWindowText 却可以。
自己做吧,我就是这样做的。
从 CEdit 派生出自己的类 CMyEdit,要处理的消息有:WM_KILLFOCUS
用 SendMessage 向父窗口(AppWizard 创建的 CListView 派生类)发送一个自定义消息,通知父窗口编辑结束;父窗口收到消息后改变相应 List Item,用 SetListItem。WM_CHAR
如果是 VK_RETURN/VK_TAB(或其他你认为比较特殊的),得到父窗口,把焦点转移过去,这样就自动触发上面的 OnKillFocus 处理;如果是 VK_ESCAPE,就隐藏窗口。在 CListView 类中,处理 NM_CLICK 通知消息,在适当的位置显示你的 CMyEdit 窗口;重载 WindowProc 以截获自定义消息。还有有很多细节问题,好好研究,很有意思。
我可提供源程序,不过很复杂;可以给我 email 索要。
SetWindowText、GetWindowText都可以。
GetWindowLong、SetWindowLong改其风
格也可以,但改动窗口大小、位置的都
不行。过份!现在虽然很好用,但是编辑的时候有点
不够美观。有没有简单的方法?复杂的方法一概不
要!
不知道你是如何做的,但是在BCG的代码中可以实现这个功能。其代码如下:
BOOL CBCGEditListBox::EditItem(int iIndex)
{
....
CEdit * pEdit=m_wdnList.EditLable(iIndex);
CRect rectClient;
GetClientRect(rectClient);
CRect recEdit;
pEdit->GetClientRect(rectEdit);
pEdit->SetWindowPos(NULL,-1,-1,rectClient.Width()-10,rectEdit.Height(),SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
return TRUE;
}
更详细的内容你可以去下载一个BCG的类库来研究一下。www.codetools.com中有。
谢谢!
不过你的方法还是有问题,虽然刚激活时好像
可以,但输入时就变了,和以前一样!
// m_cEdit 是 CTestDlg的一个成员变量,类型是 CMyEdit.
void CTestDlg::OnBeginlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult)
{
m_cEdit.SubclassWindow( m_cList.GetEditControl()->m_hWnd );
*pResult = 0;
}/* WM_SIZE 消息处理函数如下:*/
void CMyEdit::OnSize(UINT nType, int cx, int cy)
{
static int cx1 = 80;
static int cy1 = 16; // as you like
if( cx!=cx1 || cy!=cy1 ) // 防止循环调用
SetWindowPos(NULL, 0,0, cx1, cy1, SWP_NOZORDER|SWP_NOMOVE );
CEdit::OnSize(nType, cx, cy);
}
Edit,如果是自己派生的我就没必要跑到
这来问了,我自己就有这样的代码。拜托各位了,300分呢!
一句话,就是替换原来的窗口函数:
WNDPROC pOld = NULL; // 保存原来的窗口函数
LRESULT CALLBACK EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_WINDOWPOSCHANGING) {
LPWINDOWPOS lpwp = (LPWINDOWPOS)lParam;
lpwp->cx = 200; // 自己的大小
lpwp->cy = 100;
return 0;
} else
return CallWindowProc(pOld, hWnd, message, wParam, lParam);
}void CAaaDlg::OnBeginlabeleditList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
CEdit *pEdit = m_list.GetEditControl();
pOld = (WNDPROC)::SetWindowLong(pEdit->m_hWnd, GWL_WNDPROC, (LONG)EditProc);
*pResult = 0;
}
下面再说一种方法:
假设CQuoteGrid是CListCtrl的一个派生类,并重载其虚函数OnCommand。BOOL CQuoteGrid::OnCommand(WPARAM wParam, LPARAM lParam)
{
CEdit* pEdit = GetEditControl();
if( pEdit != NULL && lParam == (long)pEdit->m_hWnd )
{
if(HIWORD(wParam)==EN_CHANGE||HIWORD(wParam)==EN_SETFOCUS)
{
pEdit->SetWindowPos(NULL,0,0,80,16,SWP_NOZORDER|SWP_NOMOVE);
pEdit->SetSel( pEdit->GetSel() ); // 设置光标
}
} return CListCtrl::OnCommand(wParam, lParam);
}我试过,两种方法都可以实现。你要是再嫌麻烦的话,我也没办法了。
接近实现了,给200分先。其它的大家分,
你没意见吧?