|
The handle will always be 0 until you actually create the window.
John
|
|
|
|
|
You are right.
The problem starts when I use the Create function.....
|
|
|
|
|
Is the thread that creates this based on a UI type thread or a background worker thread? If you are using MFC (which it appears), this is very important, as you should only create UI elements with a UI thread. See AfxBeginThread() in the Docs for more info.
onwards and upwards...
|
|
|
|
|
I agree this is essential with MFC and the GUI.
John
|
|
|
|
|
Hi everybody,
I would like to create a function which could allocate memory for any of pointer of pointer declared.
In my class C, i consider 2 pointers of pointers : **p and **q ( declared as public in class C), i would like to create a function AllocMemPointerOfPointer, which takes 3 input : RowSize, ColSize and Pointer. The function doesn't return value. It just allocate memory for Pointer, which is a pointer on RowSize pointers of any type .
How could i do that without allocate memory to a "copy" of Pointer ?
I hope my question is clear ! if not, feel free to ask me more informations !
Thanks in advance for your answers
Gerald
|
|
|
|
|
typedef struct DOUBLE_MATRIX
{
double **ppdDoubleMatrix;
MIINT32 iRows;
MIINT32 iColumns;
}DOUBLE_MATRIX;
static DOUBLE_MATRIX *New(MIINT32 iRows, MIINT32 iColumns)
{
DOUBLE_MATRIX *pxThis = NULL;
pxThis = calloc(1, sizeof(mxSystemDOUBLE_MATRIX));
if (pxThis && iRows > 0 && iColumns > 0)
{
MIINT32 iRowsCounter = 0;
pxThis->iRows = iRows;
pxThis->iColumns = iColumns;
pxThis->ppdDoubleMatrix = (double **) calloc(iRows, sizeof(double *));
for (iRowsCounter = 0; iRowsCounter < iRows; iRowsCounter++)
{
pxThis->ppdDoubleMatrix[iRowsCounter] = (double *) calloc(iColumns, sizeof(double));
}
}
return pxThis;
}
Papa
while (TRUE)
Papa.WillLove ( Bebe ) ;
|
|
|
|
|
Maybe you should make your modal dialog window have the desktop as its parent?
Try calling GetDesktopWindow() and use the returned handle for the parent of the modal dialog and see if that helps.
|
|
|
|
|
Hi!
I am trying to use the registry with win32 api c++.
But I have difficulties using the RegQueryValue functions.
I found some examples on the net but they all use CString and I cant use it because I dont write in MFC...
Can someone write an example? ( if possible the whole thing how to get a value?)
Thanks in advance!
Well... I am a beginner ...
|
|
|
|
|
A very simple example how to get the Windows product name:
HKEY hKey;
TCHAR tszProductName[128];
DWORD dwBufSize = 128;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion"), 0, KEY_READ, &hKey);
RegQueryValueEx(hKey, _T("ProductName"), NULL, REG_SZ, (LPBYTE)tszProductName, &dwBufSize);
RegCloseKey(hKey);
printf("Windows Product Name: ");
printf(tszProductName);
Hope that helps
Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
(doesn't work on NT)
|
|
|
|
|
Scolinks wrote:
But I have difficulties using the RegQueryValue functions.
I found some examples on the net but they all use CString and I cant use it because I dont write in MFC...
There are plenty of MSDN examples that do not use MFC. Here's but one:
#define RTN_UNKNOWN 0
#define RTN_SERVER 1
#define RTN_WORKSTATION 2
#define RTN_NTAS 3
#define RTN_ERROR 13
DWORD GetWindowsVariant(void)
{
#define MY_BUFSIZE 32 // Arbitrary initial value.
HKEY hKey;
TCHAR szProductType[MY_BUFSIZE];
DWORD dwBufLen = MY_BUFSIZE;
LONG lRet;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"),
0,
KEY_QUERY_VALUE,
&hKey) != ERROR_SUCCESS) return RTN_ERROR;
lRet = RegQueryValueEx(hKey,
TEXT("ProductType"),
NULL,
NULL,
(LPBYTE)szProductType,
&dwBufLen);
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS) return RTN_ERROR;
if(lstrcmpi(TEXT("WINNT"), szProductType) == 0)
return RTN_WORKSTATION;
if(lstrcmpi(TEXT("SERVERNT"), szProductType) == 0)
return RTN_SERVER;
if(lstrcmpi(TEXT("LANMANNT"), szProductType) == 0)
return RTN_NTAS;
else return RTN_UNKNOWN;
} Here are some searches returned from Google:
http://www.windowsitlibrary.com/Content/69/07/1.html
http://www.geocities.com/merijn_bellekom/new/win9xcpu.html
http://www.pc-magazin.de/common/forum/forum.php?id=30000624&forum=30&dsp_start=120&expand=1&suchwort=
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
Hi !
I have a vector of objects of class B. Class B is derived from class A :
A function in my application is asking for a vector of class A objects.
I want to pass my vector of B objects (which I guess should be possible because B objects are A objects, thus a vector of B objects if also a vector of A objects).
Here is a snippet of what I tried :
class A;
class B : public A;
void foo(std::vector<const A>& vect)
{
}
void main()
{
std::vector<const B> MyVect;
MyVect.push_back(new B);
foo(MyVect);
}
I get a compile error, telling me that it's not possible to convert std::vector<const B> to std::vector<const A>.
How can I solve this ?
Thanks !
Jerome
|
|
|
|
|
Hi Jerome
This cast can't be possible because std::vector< const A > and std::vector< const B > isn't the same class. I think you can do a template function like:
// file foo.h
template< class _T >
inline void foo( std::vector< const _T > &rVector )
{
// in your case you can do
const A &rEntry = ( const A& ) rVector[ nIndex ];
...
...
}
The compiler creates now two methods like:
inline void foo( std::vector< const A > &rVector )
{
const A &rEntry = ( const A& ) rVector[ nIndex ];
...
...
}
and
inline void foo( std::vector< const B > &rVector )
{
const A &rEntry = ( const A& ) rVector[ nIndex ];
...
...
}
cgott
|
|
|
|
|
The solution is to sstore pointers in the vector.
John
|
|
|
|
|
Hi !
I tried, but it doesn't work either. The vector I use look like this :
std::vector<A*> and std::vector<B*>
but the compiler is not able to convert....
Thanks anyway !
Jerome
|
|
|
|
|
The classes need to be derived from the same parent:
class C<br />
{<br />
};<br />
<br />
class A : public C<br />
{<br />
};<br />
<br />
class B : public C<br />
{<br />
};
And then you can have:
std::vector<C *>
And store A's and B's
|
|
|
|
|
The solution by Jonny is the correct way to do this.
John
|
|
|
|
|
hey,
I need help with this program i need to make, ok first off i have one console application written in c# and compiled, its a simple program that should take 2 arguments from the command line e.g.( runApp 2 4 ) and it will take the 2 arguments 2 & 4 and add them together. SIMPLE
Now the hard part is i need another application preferably in C++, can be in C#, and what it has to do is test the first application. So it needs to run it within itself (kinda like a testing script in unix) and give it the arguments it needs, then read the value (i.e. the total sum) and compare it with its own result.
So basically it runs the same function as in the first program, stores the value in a variable, then runs the first program, gets output from it and compares the 2 values.
Hope anyone can help.
Cheers Stan
|
|
|
|
|
Where does the first application send its output? If it's to standard output, read these two articles:
http://support.microsoft.com/default.aspx?scid=kb;en-us;190351
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_a_child_process_with_redirected_input_and_output.asp
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
Try using the exit code of the console process to return the result. Usually, main returns an integer that is the exit code of the process. This can be obtained with the CreateProcess function.
__________________________________________
a two cent stamp short of going postal.
|
|
|
|
|
I created a bitmap image with image editor in VS6 and attached to a CButton. However, there is a problem with showing colors accurately.
I changed light gray - RGB(192,192,192) that was in original palette with RGB(208,208,200) using Adjust Colors... in Image menu, but when the app starts the bitmap's color is the old light gray. What should I do to fix this problem?
|
|
|
|
|
Hi,
I'm developping an SDI app that is able to load custom 'pluggable' toolbars from a DLL. The DLL is an MFC resource DLL and is loaded at runtime (using the path) and must export the function CToolBar * GetToolBar();. In the app's mainwindow and can then load the dll and get the toolbar by setting CToolBar * m_pPluginToolBar = pGetToolBar()... This pointer is then used to create the toolbar using a simple CreateEx(this) function (as any onther toolbar) on the pointer. This all works fine and in the OnCreate of the custom toolbar in the dll I set the images from the resources in the dll and the texts for the buttons.
Strange thing is that the images show up right and I can do anything I want with the toolbar, but the text is not below the buttons. Even if a call a separate exported function in the dll after the CreateEx function is called and in there I call SetButtonText the text will not come under the buttons. If I then call SetButtonText() from within the main window (using the m_p... member) the text DOES appear on the button!!
Can anyone explain this? Make this work from within the DLL?
Any help would be appreciated!!
|
|
|
|
|
Dears:
in MainFrame Toolbar i added new button called Rectangle.
that when i clicked it i can draw rectangle on screen by mouse.
now if i want to add drag and drop functionality to the rectangle button in toolbar like (Visual C++ Controls Dialog),.be able to drag to button to view and when release the mouse the shape drawn automatically with specific size.
is it possible to add Drag/Drop functionallity to Toolbar buttons.
Thanks
|
|
|
|
|
raed wrote:
is it possible to add Drag/Drop functionallity to Toolbar buttons.
In short, yes.
You'll need to look up TBN_DRAGOUT notification message.
Cut-and-pasted-and-in-need-of-adapting-for-your-requirements code:
(This does have dependencies on other stuff, which is why its never been an article!)
class CImcToolBar : public CToolBar, public CImcMenuDropTarget
{
public:
CImcToolBar (int nToolResourceID);
protected:
DECLARE_MESSAGE_MAP();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy( );
afx_msg void OnBeginDragging ( NMHDR * pNotifyStruct, LRESULT* result );
virtual BOOL AcceptsMenuDrag (DRAGMENUITEM *dmi);
virtual CPoint ConstrainDragCoords (CPoint pt);
virtual DROPEFFECT MenuDragDropped (CPoint pt, DRAGMENUITEM *dmi);
int m_nToolResourceID;
};
BEGIN_MESSAGE_MAP(CImcToolBar, CToolBar)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_NOTIFY_REFLECT( TBN_DRAGOUT, OnBeginDragging )
END_MESSAGE_MAP()
CImcToolBar::CImcToolBar (int nToolResourceID)
{
m_nToolResourceID = nToolResourceID;
m_deDrag = DROPEFFECT_NONE;
}
int CImcToolBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CToolBar::OnCreate(lpCreateStruct) == -1)
return -1;
RegisterMenuDragDrop (this, IDB_DRAGTOTOOLBAR, RGB(255,0,255));
return 0;
}
void CImcToolBar::OnDestroy ()
{
RevokeDragDrop (m_hWnd);
}
void CImcToolBar::OnBeginDragging ( NMHDR * pNotifyStruct, LRESULT* result )
{
NMTOOLBARA *nm = (NMTOOLBAR *) pNotifyStruct;
CFrameWnd *pFrame = GetDockingFrame ();
ASSERT(pFrame);
if (!pFrame)
return;
DRAGMENUITEM dmi;
dmi.nID = dmi.ItemInfo.wID = nm->iItem;
dmi.nToolbarID = GetDlgCtrlID ();
UINT nFormat = RegisterClipboardFormat (TEXT("ImcMenuDragData"));
ASSERT(nFormat);
if (!nFormat)
return;
TBBUTTONINFO btnInfo;
memset (&btnInfo, 0, sizeof (btnInfo));
btnInfo.cbSize = sizeof (btnInfo);
btnInfo.dwMask = 0;
int nItem = SendMessage (TB_GETBUTTONINFO, nm->iItem, (LPARAM)&btnInfo);
ASSERT(nItem >= 0);
if (nItem < 0)
return;
TBBUTTON btnOld;
if (!SendMessage (TB_GETBUTTON, nItem, (LPARAM)&btnOld))
return;
if (!SendMessage (TB_DELETEBUTTON, nItem))
return;
pFrame->RecalcLayout ();
pFrame->UpdateWindow ();
HANDLE hData = ::GlobalAlloc (GMEM_MOVEABLE | GMEM_SHARE, sizeof (DRAGMENUITEM));
char *buf = (char*) ::GlobalLock (hData);
memcpy (buf, &dmi, sizeof (DRAGMENUITEM));
::GlobalUnlock (hData);
COleDataSource ods;
CImcDropSource ids;
ods.CacheGlobalData (nFormat, hData);
DROPEFFECT de = ods.DoDragDrop (DROPEFFECT_COPY | DROPEFFECT_MOVE, NULL, &ids);
GlobalFree (hData);
if (de == DROPEFFECT_NONE)
SendMessage (TB_INSERTBUTTON, nItem, (LPARAM)&btnOld);
pFrame->RecalcLayout ();
}
BOOL CImcToolBar::AcceptsMenuDrag (DRAGMENUITEM *dmi)
{
return dmi && !dmi->ItemInfo.hSubMenu;
}
CPoint CImcToolBar::ConstrainDragCoords (CPoint pt)
{
CRect rcClient;
GetClientRect (&rcClient);
pt.y = m_rcDragImage.Height () / 2;
CRect rcItem (-1,-1,-1,-1);
for (int nItem = 0; ;nItem++ )
{
if (!SendMessage (TB_GETITEMRECT, nItem, (LPARAM)&rcItem))
break;
if (rcItem.PtInRect (pt))
break;
}
if (pt.x < rcItem.CenterPoint ().x)
pt.x = rcItem.left;
else
pt.x = rcItem.right;
pt.y = rcItem.CenterPoint ().y;
return pt;
}
DROPEFFECT CImcToolBar::MenuDragDropped (CPoint pt, DRAGMENUITEM *dmi)
{
TBBUTTONARRAY btnArray;
int nButtons = dmi->CreateDroppedButtonArray (btnArray, m_nToolResourceID);
if (!btnArray.GetSize ())
return DROPEFFECT_NONE;
int nItem, nItemMax = SendMessage (TB_BUTTONCOUNT);
CRect rcItem (-1,-1,-1,-1);
for (nItem = 0; ;nItem++ )
{
if (!SendMessage (TB_GETITEMRECT, nItem, (LPARAM)&rcItem))
break;
if (rcItem.PtInRect (pt))
break;
}
BOOL bBefore = pt.x < rcItem.CenterPoint ().x;
if (!bBefore && (nItem != nItemMax))
{
bBefore = TRUE;
nItem++;
}
while (btnArray.GetSize ())
{
if (bBefore)
SendMessage (TB_INSERTBUTTON, nItem++, (LPARAM) btnArray.GetData ());
else
SendMessage (TB_ADDBUTTONS, 1, (LPARAM) btnArray.GetData ());
btnArray.RemoveAt (0);
}
CFrameWnd *pFrame = GetDockingFrame ();
if (pFrame)
pFrame->RecalcLayout ();
return (dmi->nToolbarID == GetDlgCtrlID ()) ? DROPEFFECT_MOVE : DROPEFFECT_COPY;
}
|
|
|
|
|
Thanks ,valuable code.
is it possible to Derived a class From CToolBar and then handling Mouse Event on toolbar after getting its ID or something like that, to add this functionality.
Thanks
|
|
|
|
|
Yes, its possible. Its probably not a good idea though. Users expect standard behaviour from things
that look standard. If you start making it behave in a non-standard way, users will think the soft-
ware is broken. Even if its better!
You can also use message reflection to get NM_RCLICK from the toolbar.
Let it do the work for you!
raed wrote:
Thanks ,valuable code.
Just remember you owe me a drink!
Iain.
|
|
|
|
|