一个基于对话框的程序,对话框界面上有很多控件,我是在1024*768下面设置的对话框大小,可是当我在800*600下显示时,对话框不能完整显示,由于太大一部分显示不出来,因此我想根据分辨率的大小来动态改变对话框及其上的控件的大小。请问我应该怎么做?
解决方案 »
- vc listcontrol控件怎么实现分行显示?
- 在MainFrame中用create方法创建一个非模态对话不能响应控件消息,上面的按钮连点都点不动?
- 谁能告诉我CFILE类是不是在CVIEW中声明并实现;
- 编程自动在Gmail的邮件编辑框中插入图片的问题
- 用clistview实现了一个文件浏览器,如果双击里面的文件让它执行。
- 救救我呀、谢谢各位
- 请教一个API函数:SetWindowRgn 高分在线等待!结贴迅速,欢迎up!
- 啥是ATL啊?
- 动态生成数据管道
- 关于多线程使用com的问题
- 100 分!谁有用MFC写的进程外组件的例子!本人写的代码无法声称正确的代理/存根DLL!
- 如何得到用户输入的文字?
: CDialog(CSmartDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSmartDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
这段代码要怎么变呢
假设在这个dll的资源中我新建了一个对话框,那在dllmain中要写些什么来跟这个对话框相联系呢
在我的应用程序的initinstance中哪个地方加载这个dll呢
BOOL CSmartApp::InitInstance()
{
m_pApp = (CSmartApp*) AfxGetApp(); AfxEnableControlContainer(); // Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif CSmartDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
} // Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}这些部分我要做什么改动和替换呢?能详细一点吗?
谢谢
//获取分辨率
HDC hDC=::GetDC(NULL);
long nPixelWidth=GetDeviceCaps(hDC,HORZRES);
::ReleaseDC(NULL,hDC);
//根据不同分辨率加载不同的资源
if( nPixelWidth<=800 )
hResDll=::LoadLibrary(_T("Res800.dll"));
else
hResDll=::LoadLibrary(_T("Res1024.dll"));
然后在exitinstance中加入freelibrary(hresdll)就可以了。
做资源DLL最好是在程序写好以后将资源脚本中的代码从主程序cut/paste到dll的资源脚本中,如果你
在dll中从头去做一个对话框,然后想在主程序中使用用它的话则会很麻烦,因为这样appwizard提供的辅助功能都不能用了。
“做资源DLL最好是在程序写好以后将资源脚本中的代码从主程序cut/paste到dll的资源脚本中,如果你
在dll中从头去做一个对话框,然后想在主程序中使用用它的话则会很麻烦,因为这样appwizard提供的辅助功能都不能用了。”
是什么意思啊?
其实调用dll我也调用过,我就是不明白为什么调用一次dll,程序的主界面就会改变,可能是dll中的技巧,所以您上面的这段话我不明白,能详细解释一下吗?
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);//屏幕宽度
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);//屏幕高度然后,在OnInitDialog中SetWindowPosition,就能改变对话框大小.不过我不知道对应的控件怎么变化.GZ
而resource.h中对应的资源ID的定义则要copy过去.
"如果你在dll中从头去做一个对话框,然后想在主程序中使用用它的话则会很麻烦",意思是说你在DLL中新加了一个对话框IDD_DIALOG1,然后在主程序里想使用它,一般来说要生成一个对应该对话框的类,而如果主程序中没有这个对话框的资源,那么就无法用classwizard自动生成对应于IDD_DIALOG1的类了。
至于加载DLL后界面改变,是因为程序在运行过程中,对话框的事件、行为是放在程序代码(.h,.cpp)中,而外观则是放在资源中,资源一般在.rc中编写,编译为.res后再链接进.exe中,比如about对话框中有这么一行enum { IDD = IDD_ABOUTBOX };,而构造函数又会调用CDialog(CAboutDlg::IDD),也就是根据IDD_ABOUTBOX指定的资源来决定对话框的外观。把资源编译进DLL后,加载的DLL不一样,资源也就不一样了,所以对话框 的外观会改变。