1.MDI程序中,如果将子窗口最大化,框架就自作多情的把子窗口的标题加上-[ 子窗口标题]写在主窗口标题后面,如何制止这种行为?
2.一般窗口的右上角都有一个带方框的X号,默认执行该窗口的关闭操作,我想编程修改他的默认操作,请问应该处理哪个消息?
3.VC不允许工具栏图标大于16色,我想实现真彩色工具栏按钮图标,如何编程?
4.SendMessage()函数可以向一个窗口发送带参数的消息,这个参数只能是LONG型数据,我想向窗口发送消息时,附加传送字符串”asdfghhjlk”,如何实现?
5.假设一个应用的数据情况如下描述:
将每年12个月的产值数据写入文件,它的串行化函数可以写为:
void CmyDoc::Serialize(Carchive &ar)
{
if(ar.IsStoring())
{
ar<<m_nYear;    //写入年
for(int I=0;I<12;I++)
{
ar<<I<<m_product; //写入月份和产值
}
}
else 
{
ar>>m_nYear;    //
for(int I=0;I<12;I++)
{
ar>>I>>m_product; //
}
}假设由于一些原因,在数据录入时出错(比如某年的一个月数据有误或中间漏记某年数据),如何修改上面的函数实现可以进行数据的修改和在指定位置的数据添加和删除操作.
6.使用Microsoft Forms2.0 label控件在对话框中显示彩色字符时,程序在98下显示正常,在2000下彩色字符的背景发黑,如在2000下调整好,在98下,字符背景发白,如何解决?

解决方案 »

  1.   

    1 用SetWindowText()修改2 处理WM_SYSCOMMAND消息,在里面判断nID是否为SC_CLOSE
      

    制作真彩工具条
    http://www.vckbase.com/document/viewdoc/?id=1069
      

  2.   

    1、SetWindowText应该可以改的吧
    2、这个x好像没有句柄,不知道是否可以拦截他的消息
    4、发送这个字符串的指针,接受后进行转换
    6、如果实在不行,可以考虑判断操作系统,然后作不同的处理
      

  3.   

    1。最大化的时候可以重新设置childframe的名字。
    2。在childframe里处理WM_CLOSE
    3。制作真彩的toolbar,在资源里插入,虽然无法打开,但给资源改名你要调用的ID,如IDR_MAINFRAME
    4。用指针就可以了
    5。不清楚,可以看看串行化的东西
    6。这是因为你的toolbar里的图像所采用的透明色和系统的不一样,在16色下,可以用VC自带的刷子达到透明的效果,但由于你的图像是自己做的真彩色,所以系统无法知道该屏蔽什么,所以就会产生这个问题。可以创建两张图,一张normal,另外用于disbale(必需的,不然disable会一样的),指明透明色。
    bitmap[0].LoadBitmap(IDR_MAINFRAME);
    imageList[0].Create(16, 15, ILC_COLORDDB|ILC_MASK, 13, 1); 
    imageList[0].Add(&bitmap[0], 0x00c8d0d4); //图像的透明色,就是不要的颜色。
    m_wndToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList[0].m_hImageList);
    m_wndToolBar.SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)imageList[0].m_hImageList);
    imageList[0].Detach();
    bitmap[0].Detach();

    // Create and set the disable toolbar image list.
    bitmap[1].LoadBitmap(IDB_BITMAP1_COLD);
    imageList[1].Create(16, 15, ILC_COLORDDB|ILC_MASK, 13, 1);
    imageList[1].Add(&bitmap[1], 0x00c8d0d4);
    m_wndToolBar.SendMessage(TB_SETDISABLEDIMAGELIST, 0, (LPARAM)imageList[1].m_hImageList);
    imageList[1].Detach();
    bitmap[1].Detach();      
      

  4.   

    1.使用SetWindowText是可以设置窗口标题,但如果在初始化时就设置子窗口为最大化显示,那么在程序正常启动后,必须单击某个菜单项或鼠标键才行,我的意思是:如何在程序初始化设置子窗口为最大化显示的情况下,程序启动后主窗口标题不变?
    4.我要发送的是string 型数据!!!!!!
    5.我的意思是:如何将一般的串行化函数修改成具有可以在已经存在的数据链的指定位置随意进行修改插入删除数据而不影响其它不需要处理的数据的能力,在实验中,连简单的定位函数Seek都使用无效!!!!
      

  5.   

    4:cstring 可以得到里面的字符指针,然后传递,
      

  6.   

    CString类型本身就是一个指针,可以直接以指针传递
      

  7.   

    发送字符串消息最好用WM_COPYDATA消息
    发送:
    COPYDATASTRUCT CopyStr;
    CopyStr.cbData = (DWORD)m_strFilePath.GetLength();
    CopyStr.dwData = (DWORD)1;
    CopyStr.lpData = m_strFilePath.GetBuffer(m_strFilePath.GetLength());
    ::SendMessage(m_dlg,WM_COPYDATA,NULL,(LPARAM)&CopyStr);接受
    重载WM_COPYDATA消息
    BOOL CDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
    // TODO: Add your message handler code here and/or call default
    CEdit *pEdit =(CEdit*)(GetDlgItem(IDC_EDIT_FILEPATH));

    CString str =(char*)pCopyDataStruct->lpData;
    long len = pCopyDataStruct->cbData;
    pEdit->SetWindowText(str.Left(len));
    return CDialog::OnCopyData(pWnd, pCopyDataStruct);
    }
      

  8.   

    5.假设一个应用的数据情况如下描述:
    将每年12个月的产值数据写入文件,它的串行化函数可以写为:
    void CmyDoc::Serialize(Carchive &ar)
    {
    if(ar.IsStoring())
    {
    ar<<m_nYear;    //写入年
    for(int I=0;I<12;I++)
    {
    ar<<I<<m_product; //写入月份和产值
    }
    }
    else 
    {
    ar>>m_nYear;    //
    for(int I=0;I<12;I++)
    {
    ar>>I>>m_product; //
    }
    }假设由于一些原因,在数据录入时出错(比如某年的一个月数据有误或中间漏记某年数据),如何修改上面的函数实现可以进行数据的修改和在指定位置的数据添加和删除操作.
      

  9.   

    第一个问题很好解决,你在MainFrm创建的时候就CString str; GetWindowText(str)得到它的标题,保存起来,每次子窗口最大化的时候你在得到最大化消息的地方SetWindowText(str)就可以了,
      

  10.   

    第二个问题只要捉WM_CLOSE消息就可以了,第三个问题:不是它不允许,而是它打不开,但你可以用
    第四个问题,不知道你要发什么消息,如果你只是要发字符串的话,可以用WM_COPY或其他方法,不要学死了,要灵活用啊