|
The person who wrote the DLLs used the same name for the message window in each DLL hence the bug!
|
|
|
|
|
Hello,
i am trying to handle problem with directX 9 and code:blocks.
i searched the internet and after installing the sdk properly and used a tutorial to compile the directx code in an static control window of my winapi program. The IDE doesn't give an error, but instead of compiling a grey window the code only does a black window over the other dialog elements, who won't be compiled properly on screen. The programm doesn't shutdown and the window bar still is in function.
Does anyone knows what's to do?
Here ist the code in cuts:
void initD3D(HWND hDlg30)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hDlg30;
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hDlg30,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
}
HRESULT CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9 **ppReturnedDeviceInterface);
void render_frame(void)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(70, 70, 70), 1.0f, 0);
d3ddev->BeginScene();
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}
void cleanD3D(void)
{
d3ddev->Release();
d3d->Release();
}
And this is the dialog code so far:
BOOL CALLBACK RaumkarteProc(HWND hDlg30, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
HDC hdcZeichnung;
RECT rect;
static HWND hwndRaumkarteAktion1, hwndRaumkarteAktion2,
hwndRaumkarteHScroll, hwndRaumkarteVScroll, hwndRaum;
int AnzahlGegner;
static int rightWidth=1100;
static int lowerHeight=650;
static int leftWidth=300;
static int upperHeight=50;
bool Kartezeichnen=true;
static int iAktions1index;
static int Aktion1auslesen;
static char Aktion1auswahl[100];
int Kartenmobilanzahl;
Kartenmobilanzahl=Zufallsgegner_Raum.size();
hwndRaum=GetDlgItem(hDlg30,ID_RAUMKARTE31);
initD3D(hDlg30);
switch (message)
{
case WM_INITDIALOG:
{
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Flug");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Feuergefecht");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Planet");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Handelsdock/ Basis");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Kom Kanal");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Scan");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Ladung abwerfen");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Ladung tauschen");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEAKTIONSLISTE34,LB_ADDSTRING,NULL,(LPARAM)"Runde abschließen");
return FALSE;
};
case WM_PAINT:
{
if (Kartezeichnen==true)
{
render_frame();
}
}
break;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case WM_KEYDOWN:
{
return FALSE;
}
case WM_SIZE:
{
return FALSE;
}
case VK_ESCAPE:
{
cleanD3D();
EndDialog(hDlg30,0);
return TRUE;
}
case ID_RAUMKARTEAKTIONSLISTE34:
{
if (LOWORD(wParam)==ID_RAUMKARTEAKTIONSLISTE34&&HIWORD(wParam)==LBN_DBLCLK)
{
iAktions1index=SendMessage(GetDlgItem(hDlg30, ID_RAUMKARTEAKTIONSLISTE34), LB_GETCURSEL,0,0);
Aktion1auslesen=SendMessage(GetDlgItem(hDlg30, ID_RAUMKARTEAKTIONSLISTE34),LB_GETTEXT,iAktions1index,(LPARAM)Aktion1auswahl);
if (strcmp(Aktion1auswahl, "Flug")==0)
{
Zielfadenkreuz==true;
UpdateWindow(hDlg30);
SendDlgItemMessage(hDlg30, ID_RAUMKARTEWAHLAKTIONSLISTE35,LB_ADDSTRING,NULL,(LPARAM)"Flug ausfuehren");
SendDlgItemMessage(hDlg30, ID_RAUMKARTEWAHLAKTIONSLISTE35,LB_ADDSTRING,NULL,(LPARAM)"Flugmodus beenden");
return FALSE;
}
else if (strcmp(Aktion1auswahl, "Runde abschließen")==0)
{
cleanD3D();
EndDialog(hDlg30,0);
return TRUE;
}
}
return FALSE;
}
}
break;
}
return FALSE;
}
|
|
|
|
|
Start with the obvious the line that is supposed to make the screen grey is Render_frame
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(70, 70, 70), 1.0f, 0);
That function actually returns a result which isn't used in your code, so use the return and debug it
HRESULT result = d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(70, 70, 70), 1.0f, 0);
Now put a breakpoint on the line and check the result is D3D_OK.
It tells you in the directx9 help for the function
IDirect3DDevice9::Clear will fail if you:
Try to clear either the depth buffer or the stencil buffer of a render target that does not have an attached depth buffer.
Try to clear the stencil buffer when the depth buffer does not contain stencil data.
Creating a Depth Buffer (Direct3D 9) (Windows)[^]
It is noted in your initD3D function it doesn't seem to do that
It is noted in you setup these two lines you appear to be missing
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
In vino veritas
|
|
|
|
|
Hello,
i tried to fix this, but it still doesn't work. I thougth about it and i guess it could be anything with the ressource file of the dialogue.
LANGUAGE 0, SUBLANG_NEUTRAL
IDD_DIALOG30 DIALOG 0, 0, 1000, 600
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Raumkarte"
FONT 8, "Ms Shell Dlg"
{
CONTROL "", ID_RAUMKARTE31, WC_STATIC, SS_BLACKFRAME, 201, 0, 800, 600, WS_EX_ACCEPTFILES | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
SCROLLBAR ID_SCROLLBARVER32, 202, 2, 19, 186, SBS_VERT, WS_EX_LEFT
SCROLLBAR ID_SCROLLBARHOR33, 222, 2, 214, 15, 0, WS_EX_LEFT
LISTBOX ID_RAUMKARTEAKTIONSLISTE34, 1, 0, 198, 183, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY, WS_EX_LEFT
LISTBOX ID_RAUMKARTEWAHLAKTIONSLISTE35, 1, 187, 198, 188, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY, WS_EX_LEFT
}
The DirectX Code should be in the Static Control "ID_RAUMKARTE31".
Maybe i have to add a parameter.
Thx & Greetings
|
|
|
|
|
I added these lines. There is still no effect. Please take a look at the code i postet with a thread i made in questions.
I think it has something to do with the way i manage the edit control where directx is supposed to render. It would be really nice if you take a look in my other thread.
Thanks a lot.
|
|
|
|
|
I have a CMFCToolbar that contains a CMFCToolBarMenuButton (which will display a drop down menu).
I add my custom button like this (not production code)
LRESULT CMainFrame::OnToolbarReset(WPARAM wp, LPARAM)
{
UINT uiToolBarId = (UINT) wp;
if (uiToolBarId == IDR_TOOLBAR1 )
{
CMenu m_Menu;
m_Menu.LoadMenu(IDR_OUTPUT_POPUP);
MyToolbarMenuButton menuButton(ID_BUTTON32771, m_Menu.GetSubMenu(0)->GetSafeHmenu(), GetCmdMgr()->GetCmdImage(ID_BUTTON32771, FALSE), NULL, FALSE);
m_MaxToolbar.ReplaceButton(ID_BUTTON32771, menuButton);
}
return 0;
}
Eventually, in the framework, I get to this function :
int CMFCToolBar::InsertButton(const CMFCToolBarButton& button, INT_PTR iInsertAt)
{
/1/ CRuntimeClass* pClass = button.GetRuntimeClass();
ENSURE(pClass != NULL);
/2/ CMFCToolBarButton* pButton = (CMFCToolBarButton*) pClass->CreateObject();
ENSURE(pButton != NULL);
ASSERT_VALID(pButton);
pButton->CopyFrom(button);
INT_PTR iIndex = InsertButton(pButton, (int) iInsertAt);
if (iIndex < 0)
{
delete pButton;
}
return(int) iIndex;
}
Question:
If I understand correctly the code at line 1 and 2 in CMFCToolBar::InsertButton, it will loose all information about my own derived class MyToolbarMenuButton by getting the Runtime class and casting that to the base class ?
The issue is that I want to override some virtual method in CMFCToolBarButton but when I add my own class, it is not actually "instantiated".
Thanks.
I'd rather be phishing!
|
|
|
|
|
Hello there. I am trying to call a C function in my newly created Dll project's code. But doing so produces Unresolved External Symbol error. Here is the what I am trying
Header.h
int call_main(int argc, char** argv);
Header.cpp
int call_main(int argc, char** argv)
{
return 0;
}
Now I include this Header.h in my Dll's main file and try to call call_main . Building the project produces the said error.
<h1>include "Header.h"</h1>
class Functions
{
public:
static __declspec(dllexport) int Call_MyMain(char **argv);
};
int Functions::Call_MyMain(char **argv)
{
return call_main(8, argv);
}
What could be wrong? What am I missing? Thanks for any input.
|
|
|
|
|
You need to include the object module of header.cpp inside the build of your dll.
|
|
|
|
|
I don't know what does this mean? How do I do that?
|
|
|
|
|
...means your dll project should be building header.cpp... which produces an object file.
|
|
|
|
|
It is building header.cpp and it also produces an object file
|
|
|
|
|
If you actually compiled one as C and the other as C++ (or the other way around), you'll also have to deal with name mangling...
Standard C++[^]
If they're both C++, it's actually still possible to screw up the mangling, I believe Studio allows you to set the mangling mode to each file independently (haven't used Studio in a while though).
Decorated Names[^]
|
|
|
|
|
i think You need to include the object module of header.cpp inside the build of your dll.
|
|
|
|
|
|
Just in few words my question is next:
Is there a way to get current invalid region when CWnd gets WM_NCPAINT message (in OnNcPaint() handler)?
Details:
I have a main frame with few child dialogs placed on it. Dialogs have custom controls. Custom controls have specific non-client area and that area is drawn when the control gets WM_NCPAINT message.
Now I want to invalidate (redraw) only a small part of my main frame calling InvalidateRgn(&invalidRgn). If that invalid area overlaps with control's non-client area - WM_NCPAINT is sent to the control.
Code in control's OnNcPaint() is like this:
void CMyCtrl::OnNcPaint()
{
CWindowDC dc(this);
DoPaint(&dc);
...
}
And it paints over all window dc of the control. Whole non-client area is repainted, not only invalid region which I've passed when called InvalidateRgn(&invalidRgn).
That is a behaviour I want to get rid of. I need only invalid region to be repainted. My suggestion is that I need somehow to get current invalid region and select it before painting like
dc.SelectClipRgn(&invalidRgn)
So the question is can I do that? and if yes - how?
|
|
|
|
|
GetUpdateRect API call retrieves the smallest bounding rectangle that encloses the update region and does the same function as BeginPaint which is only for use in WM_PAINT calls.
Which answers your question ... My suggestion is that I need somehow to get current invalid region? ... and yes you can set it as a clip for your drawing if you want.
In vino veritas
modified 12-Jul-16 9:07am.
|
|
|
|
|
GetUpdateRect returns only client area coordinates that should be updated. I need whole control's invalid area including non-client parts.
Actually seems I've already find an answer: when Windows send WM_NCPAINT message it puts invalid region handle into wParam, but seems in coordinates relative to the desktop, - that's what I was looking for.
|
|
|
|
|
I´m sure there is a simple solution but it drives me crazy:
class A
{ virtual bool method M() };
class B : public A { .... }
class C1 : public B
{ virtual bool method M() override };
class C2 : public B
{ virtual bool method M() override };
class D
{
static bool DoSomething( A* ptr ) { ptr -> M(); }
}
Now I am working in a codepiece of C1 which calls D::DoDomething( )
C1::anymethod()
{
D::DoSomething( this );
} Ok, thats simple: C1::M() will be called because of the inheritance
But now I wanna have that D calls the M() of C1´s base A by typecasting the this ptr to a base:
C1::anymethod()
{
D::DoSomething( (A*)this );
}
but this will also call C1:M().
How can I tell the D::DoSomething function "If you use M1() then you have to call A::M1() "
with knowing that in DoSomething by the type of the ptr?
|
|
|
|
|
The simplest solution would be to create another non-virtual function in class A:
class A
{
bool method AM();
virtual bool method M() { return AM(); }
};
class D
{
static bool DoSomething( A* ptr ) { ptr ->AM(); }
};
|
|
|
|
|
oh , the example I have is more tricky:
D should call "the next M() of any parent above the child class C1"
Its vice versa to the virtual inheritance when you call the last one in the hierarchy ...
if I call
C1::anytest ()
{
B::M();
}
it goes "up" the hierarchy an calls the next found M();
in this case A::M()
But in class D´s DoSomething where I get a ptr to C1, or C2 ...
how can do it there?
|
|
|
|
|
Sorry, this was not clear from your initial question:
Quote: But now I wanna have that D calls the M() of C1´s base A
But you can do the same:
Implement a non-virtual function B::BM() which is called by the virtual function B::M() and so on. Then you can call the non-virtual functions AM() , BM() , and so on or the virtual M() function.
If you want to call the <code> M() function of the next upper class in the hierarchy, you need to know the real class of the passed argument during run-time. This requires that your classes support some kind of Run-time type information - Wikipedia, the free encyclopedia[^].
|
|
|
|
|
I think that here[^] you will find a solution, in fact, the same solution like Jochen said.
modified 11-Jul-16 8:10am.
|
|
|
|
|
Ah the joys of deep class hierarchy in C++ and OOP coding circa 1980-1990
Probably too much danger in doing what should be done with that old code and using modern Composition over inheritance style.
It isn't going to be fun and C++ is going to fight you all the way as it will try to discourage that style.
Working with old code I feel your pain ... good luck.
In vino veritas
|
|
|
|
|
Hi,
i want develop one application which required the fast printing on dot matrix i saw one dos application it it's giving the printing very fast compared to windows
please suggest which technology should i prefer.
|
|
|
|
|
Print speed is a feature of the printer, not the operating system or programming language.
|
|
|
|
|