|
First, try to create subdialog without any scrolling. It will help to understand how the DS_CONTROL style works.
1) in main dialog insert the *static* control in place where you want the subdialog. Ensure it has an unique ID. The control will be replaced by subdialog at runtime. That's because you can't use Dialog Editor to draw a subdialog.
2) create new dialog template without title bar. On 'Styles' tab select 'Child' from 'Style' list and set border to 'None'. On 'More styles' tab check 'visible' and 'control'. Add some edits, checkboxes, etc.
3) create the MFC class for the subdialog - CSubdialogWithContents, for example. Add the following member function:
BOOL CSubdialogWithContents::Create(CWnd* pParent, UINT nTemplate, UINT nStatic)
{
if (CDialog::Create(nTemplate, pParent))
{
CWnd *pWnd=pParent->GetDlgItem(nStatic);
SetWindowPos(pWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
CRect rc;
pWnd->GetWindowRect(&rc);
pParent->ScreenToClient(&rc);
pWnd->DestroyWindow();
MoveWindow(&rc);
::SetWindowLong(*this, GWL_ID, nStatic);
return TRUE;
}
return FALSE;
}
4) make a CSubdialogWithContents variable a data member of your main dialog class. In CMainDialog::OnInitDialog, call CSubdialogWithContents::Create (after CDialog::OnInitDialog).
If everything works OK, you should see your subdialog as a part of the main dialog. Subdialog controls should be visible, and tab key should work without any problems.
To implement a scrollable subdialog, place it in another subdialog with a vert scrollbar. CSubdialogWithContents will be a child window of subdialog with scroll - its contents will be clipped by parent. All you have to do is call CSubdialogWithContents::MoveWindow in response to CSubdialogWithScrollbar::OnVScroll.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
Thanks for the help. I should get a chance to look at it within the next week. I'll let you know how I get on
|
|
|
|
|
That was really an excellent example. Great job
Ganesh Ramaswamy
|
|
|
|
|
Cool! And also about the most bizarre UI I've ever heard of. Nothing worse than a computer illiterate user group who are also too cheap to upgrade their hardware. Now everyone is going to want sliding dialogs within dialogs!
|
|
|
|
|
It's not that they're too cheap to upgrade their hardware, it's just that the operating environment does not allow for a large monitor and so the only usable screen resolution is 640x480.
|
|
|
|
|
Hi all,
I have Editbox in my program ...
I want to update scrollbar in Editbox in each adding text into editbox ...
For example:
If my Text lines in EditBox was 200 lines, then my scrollbar must update in last position of scroll bar ...
And must show last line of text automatically ...
I wrote some code with SetScrollRange and SetScrollPos, but my code won't work ...
Please help me ...
My month article: Game programming by DirectX by Lan Mader.
Please visit in: www.geocities.com/hadi_rezaie/index.html
Hadi Rezaie
|
|
|
|
|
Hi I think if you are using MFC you can simpy use the function LineScroll
with a number greater that the required and you will automatically scroll
to the last line.
But if you are not using MFC, you can try
the following
mesg
::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines);
use the nChars as zero and the nLines as a great number as possible
Kumar
|
|
|
|
|
Thank you for your helps ...
My month article: Game programming by DirectX by Lan Mader.
Please visit in: www.geocities.com/hadi_rezaie/index.html
Hadi Rezaie
|
|
|
|
|
Here is one method to append text and updating the scrollbar. Suppose you have a CEdit named m_wndText:
int nSel = m_wndText.GetWindowTextLength();
m_wndText.SetSel(nSel, nSel, TRUE);
m_wndText.ReplaceSel("Add this text");
nSel = m_wndText.GetWindowTextLength();
m_wndText.SetSel(nSel, nSel);
This is usually faster than getting the text with GetWindowText(), appending a string and then updating the entire textbox with SetWindowText().
--------------
"Criticism is often constructive because it makes you feel superior when you give it"
-- Dogbert
|
|
|
|
|
Hi,
I have to create a application that works almost like a SlideShow that is available in WindowsMe ( in Pictures Folder ), except that I have to kept the pictures in exe so no one can copy it in addition I also want to disable the ( PrintScreen ) & ( Alt+Print Screen ) to disable capturing of the pictures.
So the target picture in full screen with a Next, Previous, First & Last & Exit buttons in a corner of a screen. I can put the Images in the Resource tab & then call them using the Image Control. Am I going the right way.
Any help according to this is appreciated.
Adeel Shamsi
adeelj@iname.com
|
|
|
|
|
Hi try to look into Global Hooks,
which can trap windows keyinput.
Like for ex you might have seen CBT
and CB-Training programs, which do not seen to repond
to the standard windows keyinput also.
You can get a Global Hook and trap the keyinput and
not forward the mesgs.
kumar
|
|
|
|
|
And what about the app, which stays in memory, and every 5 secs gets active window and make copy of its dc to bmp and to file on disk? No user interaction - but works. I think that there is no way to totally block such possibility.
Do not put images (in bmp/gif/iff/jpeg/... format into the resource, cause many application (for example MsDev) can easily read resources from executable. Open exe as resource, and then export what just You want.
To workaround above problem, You must compress/encrypt or in other way alter images. Do not use commonly known algos, like zip and rar.
Hope this helps
|
|
|
|
|
I am currently experiencing problems with the rich edit control and
RTF text in piece of software I've written.
I have a Rich Edit View, using version 1 of the Rich Edit Control, for
display various pieces of RTF text. The text is edited via a dialog.
Running under Windows 95, Windows 98, Windows Me and Windows NT 4.0 I
have experienced no problems. However under Windows 2000 the RTF text
becomes corrupt when displayed. The text in the edit dialog is OK. It
seems that the font definitions in the display are being switched
round in 2000. For example,
in everything else f0 may be Arial, f1 roman, f2 symbol. But under
2000, it switches the number used for symbol, so I end up with
something like this - f0 Arial, f1 symbol, f2 roman. This causes the
text to be displayed wrong.
As far as I can see I have 4 options:
1. Use a newer version of the Rich Edit Control, but this might have
unwanted side effects on the other platforms.
2. Release a special Windows 2000 version of the software.
3. Write some kind of parser that will reset all the fonts every time.
4. Abandon RTF and use an HTML view control, but this would require
major rewrites.
Any help would be appreciated.
Thanks,
Andrew Sage
|
|
|
|
|
where i can see i have installed (windows and) msdev packs?
-about-box search failed
-add/remove search failed
thanks for reply
t!
|
|
|
|
|
Try using GetVersionEx to obtain Windows Service Pack number.
|
|
|
|
|
Hello,
I would like to know how to assign "Ctrl + tab" to change pages in my Tab Ctrl.
Thanks for help.
R.G
|
|
|
|
|
Hi,
You can trap the WM_CHAR messages in the Dialog's you are
using for the Tabs and then if the char matches the 'TAB' key
you can test for the presense for Ctrl key being down using the
GetKeyState.
If the key is pressed you call a specified funciton such as (ex)ShowNextPage
in the Tab Ctrl to show the Next Dialog.
Kumar
|
|
|
|
|
I made myself a MFC Extention DLL and I seem to be having a couple of pointer problems, event though I don't know what it is exactly. Perhaps you've got an idea...
The situation is as follows....
In-dll functions:
CString Trim(CString sInput);
CString EatString(CString * pInput1, CString sInput2);
CMyOwnObject()::CMyOwnObject(CString sInput); // constructor
Now, this is what happens when I call the in-dll functions from outside the dll:
CString s = Trim(" my string "); // this works fine!
CString s2 = EatString(&s, " "); // this gives a crash inside EatString at the point where I try to set the value of s (like this: *s = "new string");
CMyOwnObject * pNew = new CMyOwnObject("new"); // This gives a crash at the point where the constructor ends... for SOME reason it goes into the desctructor of CString (probably for "new") and there it crashes on FreeData() )
I don't want to completely rewrite all my code to BSTR's and so for the moment. Is there another way to fix this? (Trim works just fine!)
Structured programming vs. chaotic mind boggling
|
|
|
|
|
Are you absolutely sure that your DLL uses shared MFC? Set dll as active project, go to Project->Settings->C/C++ and check if you have _AFXDLL in the 'Preprocessor definitions'.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
Just checked it, but the _AFXDLL wasn't in there... So I put it there, but that didn't seem to have any effects on the result (even after clean rebuilding a couple of times)...
I just created the project with the classwizard, selecting an extention DLL... And everything works, except this... It crashes on the destructor of the input string!
I found that putting LPCTSTR in the header, instead of CString, resolves the problem, but then I have to rewrite all my headers to use LPCTSTR... And what do I do with CString * then? I can't use LPCTSTR *, right?
Structured programming vs. chaotic mind boggling
|
|
|
|
|
> Just checked it, but the _AFXDLL wasn't in there...
So it wasn't the MFC Extension DLL. You should read MFC Technical Note 033 to learn more about this.
The rule of the thumb is: .exe *and* .dll must 'Use MFC in shared DLL' - you set this in 'General' pane of the 'Settings' window.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
Hmm, actually, I don't want to use 'MFC in Shared DLL', because a business policy of ours is to always use MFC in static DLL (to avoid MFC version conflicts)... BTW, it works if I put both projects in MFC as shared DLL.
If I use MFC in a static DLL, then what is the correct way to handle input-ouput string characters? My function does the following:
CString EatString(CString * pString, LPCSTR sInput);
pString gets completely mixed up inside the function, but somehow this keeps on leading to errors. I've tried the following things:
CString EatString(CString& pString, LPCSTR sInput);
CString EatString(CString * pString, LPCSTR sInput);
CString EatString(LPCSTR * pString, LPCSTR sInput);
none of these seem to work well.... What's the standard way, anyway?
Structured programming vs. chaotic mind boggling
|
|
|
|
|
> If I use MFC in a static DLL, then what is the correct
> way to handle input-ouput string characters?
There's no such thing as static DLL - 'D' in DLL means dynamic.
If you use static lib version of MFC, your .dll and .exe will have two different heaps. Memory allocated in .exe can't be freed in .dll and vice versa. Using CString::operator= may cause heap operations, and this is going to crash when MFC isn't shared. So the declaration for EatString should look more or less like this:
int EatString(char *szOutput, int cbOutput, const char *szInput);
You can return number of characters in szOutput after completing the operation. Or the error code, or whatever.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
Hi,
If I have a class called CMyClass, I can create it both with:
CMyClass MyClass;
and
CMyClass *MyClass;
MyClass = new CMyClass;
If I have a template I can only get the first one to work like:
CMyTemplate<int> MyTemplate;
How do I create it with the 'new' operator?
TIA,
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
typedef CMyTemplate<int> CMyClass;
...
CMyClass *MyClass;
MyClass = new CMyClass;
--------------
"Criticism is often constructive because it makes you feel superior when you give it"
-- Dogbert
|
|
|
|