zoukankan      html  css  js  c++  java
  • 关于金山开源界面BkWin不能使用DDX 的解决办法

    金山开源界面BkWin熟悉的后做界面的效果还不错,但它的界面排版的特殊性,使得WTL的DDX(对话框数据交换)没法使用,具体原因是:

    金山开源界面BkWin的对话框的所有控件都是用CBkDialogView来排版和管理。

    所以WTL中的DDX是接收不到控件的消息

    看原来实现的代码:

    BOOL DDX_Text(UINT nID, LPTSTR lpstrText, int cbSize, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0)
    {

    //实际上T不是窗口控件的父窗口,所以导致下面的方法都是不成功的 

    T* pT = static_cast<T*>(this);
    BOOL bSuccess = TRUE;
    if(bSave)
    {
    HWND hWndCtrl = pT->GetDlgItem(nID);
    int nRetLen = ::GetWindowText(hWndCtrl, lpstrText, cbSize / sizeof(TCHAR));
    if(nRetLen < ::GetWindowTextLength(hWndCtrl))
    bSuccess = FALSE;
    }
    else
    {
    ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength);
    bSuccess = pT->SetDlgItemText(nID, lpstrText);
    }
    if(!bSuccess)
    {
    pT->OnDataExchangeError(nID, bSave);
    }
    else if(bSave && bValidate)   // validation
    {
    ATLASSERT(nLength > 0);
    if(lstrlen(lpstrText) > nLength)
    {
    _XData data = { ddxDataText };
    data.textData.nLength = lstrlen(lpstrText);
    data.textData.nMaxLength = nLength;
    pT->OnDataValidateError(nID, bSave, data);
    bSuccess = FALSE;
    }
    }
    return bSuccess;

     解决办法:

    修改原来atlddx.h,专门处理金山界面库的处理。

    BOOL DDX_Text(UINT nID, BSTR& bstrText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0)
    {
    T* pT = static_cast<T*>(this);
    BOOL bSuccess = TRUE;
    if(bSave)
    {
    bSuccess =::GetDlgItemText(pT->GetViewHWND(),nID, bstrText);
    }
    else
    {
    USES_CONVERSION;
    LPTSTR lpstrText = OLE2T(bstrText);
    ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength);
    bSuccess =::SetDlgItemText(pT->GetViewHWND(),nID, lpstrText);
    }
    if(!bSuccess)
    {
    pT->OnDataExchangeError(nID, bSave);
    }
    else if(bSave && bValidate)   // validation
    {
    ATLASSERT(nLength > 0);
    if((int)::SysStringLen(bstrText) > nLength)
    {
    _XData data = { ddxDataText };
    data.textData.nLength = (int)::SysStringLen(bstrText);
    data.textData.nMaxLength = nLength;
    pT->OnDataValidateError(nID, bSave, data);
    bSuccess = FALSE;
    }
    }
    return bSuccess;
    }

     修改后的文件:

    bkddx.h

    https://files.cnblogs.com/wantfly/bkddx.rar

  • 相关阅读:
    [IOI2013]Dreaming
    Lost Cows
    Mobile Service
    [POI2005]Bank notes
    [CTSC2007]动物园zoo
    [CF1093F]Vasya and Array
    [雅礼集训 2017 Day1]市场
    [APIO2014]序列分割
    [CEOI2004]锯木厂选址
    [APIO2010]特别行动队
  • 原文地址:https://www.cnblogs.com/wantfly/p/BkWin.html
Copyright © 2011-2022 走看看