|
In standard MFC wizard build application there is an option to have precompiled header - StdAfx.h
I put all my forward class declarations and all of my headers ( in proper order ) there.
I would like to do same in simple ( empty ) DLL and build a common header. I suppose I could put this common header in #ifndef / #define / #endif in each header file to avoid multiple definitions.
That way the sequence of compilation would not matter.
|
|
|
|
|
Off-course you should always use header-guards in .h-files:
<br />
<small>#ifndef _FOO_H<br />
#define FOO_H<br />
...<br />
#endif<br />
</small><br />
But what has this to do with making DLLs?
Maybe you have a problem with export & import of the classes+data in those headers? You didn't say, be specific.
-- Gisle V.
|
|
|
|
|
Vaclav_Sal wrote: I would like to do same in simple ( empty ) DLL As I said before, header files have nothing to do with DLLs. The reason for using StdAfx.h in a project is merely to speed up the compilation phase since all the preprocessing of the header files is done once and then saved in internal format that the compiler can quickly read. You can use exactly the same thing in a project that is to create a DLL.
And the sequence of headers does matter, for the reasons I stated earlier, in that all references must have some form of definition before the compiler sees them. It does not matter what type of program (executable, COM component, DLL or static library) you are building, the rules are exactly the same for the language compilation phase.
|
|
|
|
|
OK, this is a no code , <b>empty</b>, no MFC, no export / import etc. DLL.
It is, or hopefully will be, a DirectShow filter. There are tons of DirectShow resources on how to build a graph and how to build a filter. I have not found a single source which actually explains HOW such DLL works / interacts with application , even GraphEdit.
When I get it to compile (!) I will analyze it.
My problem now is that #ifndef / #define / #endif DOES NOT work building this simple DLL.
I am using same setup in all my MFC applications without a hitch.
It theory it should work, but it does not. I suppose I could put all the code in one cpp / header and complile it that way.
The block of common includes gets compiled multiple times. In each header file.I use #pragma message to track the compilation, and than the linker goes crazy.
Either my VC6.0 finallly broke or I am missing something in setup / configuration of this DLL.
At present I cannot risk, again, to use newer VS, last time I did that it messed up big time rebuilding my old MFC code without asking.
|
|
|
|
|
Vaclav_Sal wrote: My problem now is that #ifndef / #define / #endif DOES NOT work building this simple DLL. Because (I'm sorry to belabour this point) those directives have nothing to do with the program being a DLL. They are used by the compiler to include or exclude some sections of source code, in a compilation module.
Vaclav_Sal wrote: I use #pragma message to track the compilation, and than the linker goes crazy. That hardly tells us anything useful. You really need to show us some of the source code (and please use <pre> tags around it) and indicate what errors occur and where.
|
|
|
|
|
I met a weird DrawText() blinking problem. in a loop, interval is 2 seconds, I want to show some messages on a dialog screen.
i.e. 0-2 sec, message1; 2-4 sec,message2; 4-6, message3 ...
but, now the message shows like:
flash message1; 0 sec
black screen;
flash message2; 2 sec
black screen;
flash message3; 6 sec.
black screen;
what I want is :
message1; 0-2 sec
message2; 2-4 sec
message3; 4-6 sec
void CTestDlg::DrawMsg(LPCTSTR iMsgStr)
{
CDC* pDC;
CRect rect;
CString MsgStr;
HDC hDC;
LOGFONT lf;
HFONT FontNew, FontOld;
pDC = GetDC();
hDC = pDC->GetSafeHdc();
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = -14 * GetDeviceCaps(hDC,LOGPIXELSY)/72;
lf.lfWeight = 0;
FontNew = CreateFontIndirect(&lf);
FontOld = (HFONT)SelectObject(hDC,FontNew);
rect.SetRect(CPoint(274,442), CPoint(514,514));
SetBkMode(hDC,TRANSPARENT);
DrawText(hDC,dtcMsgStr,-1,rect,DT_WORDBREAK|DT_LEFT);
InvalidateRect(rect,FALSE);
SelectObject(hDC,FontOld);
DeleteObject(FontNew);
ReleaseDC(pDC);
}
|
|
|
|
|
It goes blank because you call InvalidateRect after you call DrawText, switch them around.
Within you lies the power for good - Use it!
|
|
|
|
|
InvalidateRect(rect,FALSE);
DrawText(hDC,dtcMsgStr,-1,rect,DT_WORDBREAK|DT_LEFT);
I tried the above way, same phenomenon
|
|
|
|
|
You should not be calling InvalidateRect in the same place as you are drawing to the screen. That call is to tell windows that your window needs to be updated, but you are already inside the code where the update is happening. You could simplify this by using one of the standard window controls[^].
|
|
|
|
|
In fact, I try to use a CEdit first, like:
LTEXT "N/A" IDC_TEST_MSG 88,189,128,24 CEdit* pEdit1 = GetDlgItem(IDC_TEST_MSG);
CDC* pEdit1DC = pEdit1.GetDC();
pEdit1DC->DrawText()
But, I got same phenomenon.
|
|
|
|
|
If you are using MFC classes then you should override the OnPaint [^] member function of the class.
|
|
|
|
|
then if I want to implement the display effect, what should I do?
I want to show:
message1 0-2 sec,
message2 2-4 sec,
message3 4-6 sec,
...
I hope it like (calendar time) static text, or text box control in many demo program.
that is:
2014/3/15 12:51; 2014/3/15 12:52; 2014/3/15 12:53;
update time smoothly.
|
|
|
|
|
Use something like a progress dialog.
|
|
|
|
|
No such thing, it is an embedded Win CE platform
|
|
|
|
|
Pity you did not mention that at the beginning.
|
|
|
|
|
write a test program in a MFC PC program.
Now I think I can use a control, like text box to implement my job.
but I am still wonder how can I use CRect/DrawText() to implement the same job.
|
|
|
|
|
Hello Audio/Video Gurus. I don't seem to understand what following does. Here is the function.
void TransformImage_YUY2( BYTE* pDest,
LONG lDestStride,
const BYTE* pSrc,
LONG lSrcStride,
DWORD dwWidthInPixels,
DWORD dwHeightInPixels)
{
for (DWORD y = 0; y < dwHeightInPixels; y++)
{
RGBQUAD *pDestPel = (RGBQUAD*)pDest;
WORD *pSrcPel = (WORD*)pSrc;
for (DWORD x = 0; x < dwWidthInPixels; x += 2)
{
int y0 = (int)LOBYTE(pSrcPel[x]);
int u0 = (int)HIBYTE(pSrcPel[x]);
int y1 = (int)LOBYTE(pSrcPel[x + 1]);
int v0 = (int)HIBYTE(pSrcPel[x + 1]);
pDestPel[x] = ConvertYCrCbToRGB(y0, v0, u0);
pDestPel[x + 1] = ConvertYCrCbToRGB(y1, v0, u0);
}
pSrc += lSrcStride;
pDest += lDestStride;
}
}
So, whether above function converts YUV to RGB32 or vice versa. Thanks for your input.
|
|
|
|
|
|
we developed a c++ application which its GUI uses default toolbar buttons (cut, copy, paste). It's strange same executable running on some PCs when user uses mouse hovering on the cut button, the tooltip displays as Cut (Ctrl+X); on some other PCs the tooltip displays as Cut (Shift+Delete). Does anyone know the reason and how to fix it? Since Shift+Delete doesn't do real cut. Thanks
|
|
|
|
|
You developed it, so you need to look at the source code and find out why the menu or the tooltips are different.
|
|
|
|
|
As I said in the post the "cut, copy, paste" toolbar buttons are default ones, the tooltip for "Cut" is "Cut the selection and put it on the Clipboard\nCut" was not added by our application. Don't understand why this "Cut" button's tooltip displays differently on different PCs, some PCs show "Ctrl+X", some show "Shift+Delete" which is kind of misleading.
|
|
|
|
|
What do you mean by default buttons? They will still need to have associated tooltips which are set in the source code.
|
|
|
|
|
The default toolbar buttons means when creating this MFC application using application wizard, there is default toolbar generated; we customized other toolbar buttons but leaving "cut, copy, paste" untouched. Thanks
|
|
|
|
|
They will still have tooltip text somewhere in the resource files.
|
|
|
|
|
That's true. The problem is in the whole resource file there is no "Shift+Delete" string found. "Ctrl+X" is used for "cut" button. Why does it show "Shift+Delete" when mouse hovering over it on some PCs? Thanks!
|
|
|
|