Problem dynamically creating CStatic Label: (FAIL afxwin1.inl line
With a standard label, I cannot find any simple way to change the color.
Amazing!
Options seem to be (1) make CMyLabel from scratch, or (2) subclass CStatic
I've downloaded some code that does it:
http://www.codeguru.com/cpp/controls/staticctrl/article.php/c2909/
I've created my own Test container MFC app, and lifted the core code out of
the sample.
My code (1) dynamically creates a CStatic, then (2)feeds it to the lifted
code which will subclass it.
But (1) is failing here:
pLabel->Create(
NULL,
WS_CHILD|WS_VISIBLE|SS_LEFT,
CRect(20,20,150,150),
pCWndParent
);
Here's the context:
CWnd* pCWndParent;
CStatic* pLabel;
bool ret;
switch( message )
{
case WM_CREATE:
pCWndParent = CWnd::FromHandle(hwnd);
pCWndParent->AssertValid();
// Location X
pLabel = new CStatic();
pLabel->Create(
NULL,
WS_CHILD|WS_VISIBLE|SS_LEFT,
CRect(20,20,150,150),
pCWndParent
); // FAILS
Last line fails with 'Debug Assert Failed afxwin1.inl, line 21'
Stepping into the code as far as I can:
line 696 of wincore.cpp triggers it: cs.hInstance = AfxGetInstanceHandle();
Heres the whole function:
BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{
ASSERT(lpszClassName == NULL || AfxIsValidString(lpszClassName) ||
AfxIsValidAtom(lpszClassName));
ENSURE_ARG(lpszWindowName == NULL || AfxIsValidString(lpszWindowName));
// allow modification of several common create parameters
CREATESTRUCT cs;
cs.dwExStyle = dwExStyle;
cs.lpszClass = lpszClassName;
cs.lpszName = lpszWindowName;
cs.style = dwStyle;
cs.x = x;
cs.y = y;
cs.cx = nWidth;
cs.cy = nHeight;
cs.hwndParent = hWndParent;
cs.hMenu = nIDorHMenu;
cs.hInstance = AfxGetInstanceHandle(); // <-- FAILS
:
:
I can't step into this line. 'Source not available'
Before, I could. Then I inserted some whitespace into a file to make it
clearer to follow the debug trace. This mashed the project(?!) - I got build
errors. Had to create a new project and move the files in. Now I can't step
into the code.
The 'Assert Failed ...' error message cites the offending file as
F:/blah/afxwin1.inl. But F: doesn't exist: I relabelled my external HDD
(with visual Studio on) to X: I don't know why it's looking in F:
Anyway, here's a StackDump at this point
lbl2.exe!CWnd::CreateEx(unsigned long dwExStyle=0, const char * lpszClassName=0x00b31f94, const char * lpszWindowName=0x00000000, unsigned long dwStyle=1342177280, int x , int y , int nWidth=130, int nHeight=130, HWND__ * hWndParent=0x00070f5a, HMENU__ * nIDorHMenu=0x0000ffff, void * lpParam=0x00000000) Line 696 C++
lbl2.exe!CWnd::Create(const char * lpszClassName=0x00b31f94, const char *
lpszWindowName=0x00000000, unsigned long dwStyle=1342177280, const tagRECT &
rect={...}, CWnd * pParentWnd=0x002b4844, unsigned int nID=65535,
CCreateContext * pContext=0x00000000) Line 757 C++
lbl2.exe!CStatic::Create(const char * lpszText=0x00000000, unsigned long
dwStyle=1342177280, const tagRECT & rect={...}, CWnd * pParentWnd=0x002b4844,
unsigned int nID=65535) Line 28 C++
lbl2.exe!WndProc(HWND__ * hwnd=0x00070f5a, unsigned int message=1,
unsigned int wparam=0, long lparam=2685088) Line 120 + 0x3c bytes C++
user32.dll!7597f8d2()
[Frames below may be incorrect and/or missing, no symbols loaded for
user32.dll]
user32.dll!75971912()
user32.dll!7597f73d()
user32.dll!75980817()
user32.dll!759739f7()
ntdll.dll!771399ce()
user32.dll!75973cf7()
user32.dll!75973b94()
user32.dll!7596fc9e()
lbl2.exe!WinMain(HINSTANCE__ * hInstance=0x00920000, HINSTANCE__ *
hPrevInstance=0x00000000, char * szCmdLine=0x00312c53, int iCmdShow=1) Line
61 + 0x31 bytes C++
lbl2.exe!__tmainCRTStartup() Line 263 + 0x2c bytes C
lbl2.exe!WinMainCRTStartup() Line 182 C
kernel32.dll!76c34911()
ntdll.dll!7711e4b6()
ntdll.dll!7711e489()
I tried putting
AfxSetResourceHandle(hInst);
at location X in my code above, but it doesnt help :(
I tried googling. No luck.
Please can somebody help? I'm so frustrated, but also curious to know
what's going on.
Many thanks,
Sam