|
|
thank you for the usefull links, and this is my first try:
this is my callback function
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)<br />
{<br />
if (nCode<0)<br />
return CallNextHookEx(0,nCode,wParam,lParam);<br />
if (wParam == WM_RBUTTONDOWN)<br />
{<br />
MessageBox(GetForegroundWindow(), "Yes", "Works", MB_OK);<br />
} <br />
return CallNextHookEx(0,nCode,wParam,lParam);<br />
}
and in onbutton function I set:
<br />
HOOKPROC wlm;<br />
HHOOK check;<br />
HINSTANCE WLMDLL;<br />
<br />
WLMDLL = LoadLibrary((LPCTSTR) "MyHook.dll");<br />
wlm = (HOOKPROC)GetProcAddress(WLMDLL, "MouseProc");<br />
<br />
check = SetWindowsHookEx(WH_MOUSE,wlm,WLMDLL,0);<br />
as you can see I am trying to do a mouse hook, this try is to get any right click, but later when I get it to work, I want it to be for a defined application that when it gets right click the the popup pops up
can you see what I am doing wrong in my code?
thanks in advance!
|) () |) '/
|
|
|
|
|
I am trying to inherit from a class template (CGenericList) in the constructor, however the compiler is returning:
SentenceList.cpp(6): error C2512: 'CGenericList' : no appropriate default constructor available
SentenceList.cpp
CSentenceList::CSentenceList(char strFileToRead[MAX_SENTENCE_LENGTH], bool bSorted)
: CGenericList()
...
GenericList.h
#pragma once
#include "GenericNode.h"
#include <iostream>
using namespace std;
template<class T>
class CGenericList
{...}
Jon
|
|
|
|
|
|
That's not entirely true. You can derive a new template from a template.
--
As Foretold by Nostradamus
|
|
|
|
|
You can do this:
template <class T> class Bob<T> : public vector<T>
or this:
class Bobby : public vector<int>
but not this:
class Bobbie : public vector
vector all by itself isn't a class.
--Mike--
Visual C++ MVP
LINKS~! Ericahist | PimpFish | CP SearchBar v3.0 | C++ Forum FAQ
|
|
|
|
|
Initially I couldn't see anything hinting that he wants to create a class, but now that I look at it again, he does mention .cpp files. I assumed that he was writing a new template derived from the old one.
--
Please rise for the Futurama theme song
|
|
|
|
|
|
None of CGenericList's constructors accept zero arguments.
--
Not Y3K Compliant
|
|
|
|
|
If CGenericList looks like this:
template <typename T>
class CGenericList
{
...
CGenericList(int x) { ... }
...
} then your deriving class constructor needs to pass an argument to CGenericList::CGenericList like this:
CSentenceList::CSentenceList(char strFileToRead[MAX_SENTENCE_LENGTH], bool bSorted)
: CGenericList( <<VALUE>> )
--
Broadcast simultaneously one year in the future
|
|
|
|
|
The constructor takes no parameters, is that what u mean?
GenericList.h
template<class T>
class CGenericList
{
public:
CGenericList(void)
{
m_pFirst = NULL;
m_pLast = NULL;
m_iCount = 0;
}
...
CSentenceList.h
class CSentenceList : CGenericList<char*>
{
public:
//Methods
CSentenceList(char strFileToRead[MAX_SENTENCE_LENGTH], bool bSorted = false);
virtual ~CSentenceList(void);
void sort();
unsigned int search(const char *strSearch);
//Properties
unsigned int Size;
Sentence Sentences;
private:
Sentence* Head;
};
CSentenceList.cpp
CSentenceList::CSentenceList(char strFileToRead[MAX_SENTENCE_LENGTH], bool bSorted)
: CGenericList<char*> ()
{
// initialize
Size = 0;
CGenericList<char*> LinkedList();
// read from file and update the linked list
// if (bSorted==true)
// {sort the list;}
}
...
Jon
-- modified at 12:41 Monday 7th August, 2006
|
|
|
|
|
How can I create a CView as it would be a normal control? The problem is the constructor is private because of the DECLARE_DYNCREATE. I can change that myself, but will that cause the mechanism to break? Did it and I'm getting odd errors. Just wondered if this was the reason.
|
|
|
|
|
I Understand that you want to create an independent CView derrived Class. Cannot be done!(or, Can be done, but not with any comfort). you see, you are jumping into the middle of a very complicated protocol,A View is not an independent window class, it is a view, or "rendering", of an underlaying document! The document is what you store on disk. the View class paints it on the screen.When you start messing with the DYNCREATE Macro, you start messing with underlying structures which connect the underlying file to the view. That mechanism is also a link in the chain which enables you to paste a section of what you see in a view into say an excell sheet.(however, in order to do so, far more code is needed)
The Document and the View are parts of a complicated suite of software which you got free with the compiler, it is called the MFC Framework, and you cannot in general change something in the middle, without affecting the whole. As Soon as you try, you get these strange errors.In General you have two options, Work with MFC, and follow its rules. This means in this case that you get things done in a view by making changes in the underlying document, and notify the view that things have changed. Just follow the scribble tutorial ( And DO SO, even if you have 10 years experience) to see how that's done!
Writing for MFC is not easy,things often must be done "the long way around", but there are benefits to be gained. If you follow the rules, an upgrade to the next window release, generally involves only recompilation. Also any advances in MFC will add functionality to your prrogram by no other means than your customers installing the Next service pack for their operating system.
The alternative is to roll your own! Derrive a Main Frame Class window from CMainFrame, and a Child Window from class CChildFrame, and paint your info by hand as required. Somethimes this is the right way to go! But, if you are trying to paint your own data in a View window, See Scribble
LateNightsInNewry
|
|
|
|
|
I've created a structure that looks like this:
CMainForm
--CMainView : CView
----CTabCtrl
------CViewportFull : CViewport
------CViewportMulti : CFrameWnd
--------CSplitterWnd
----------CViewport : CView
----------CViewport : CView
----------CViewport : CView
----------CViewport : CView
When the program exits I get this error in my output:
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
Warning: Creating a pane with no CDocument.
HEAP[SDIDOCVIEW-nd.exe]: Invalid Address specified to RtlValidateHeap( 003B0000, 013EEFD8 )
Windows has triggered a breakpoint in SDIDOCVIEW-nd.exe.
This may be due to a corruption of the heap, and indicates a bug in SDIDOCVIEW-nd.exe or any of the DLLs it has loaded.
The output window may have more diagnostic information
Why is this? I can post code if you tell me to :P
When i comment away the multi viewport control it doesn't crash...
-- modified at 12:56 Saturday 5th August, 2006
|
|
|
|
|
Maybe this code is important:
BOOL CMultiViewportWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CFrameWnd::OnCreateClient(lpcs, pContext);
VERIFY(m_splitterWnd.CreateStatic(this, 2, 2));
VERIFY(m_splitterWnd.CreateView(0, 0, RUNTIME_CLASS(CViewport), CSize(100, 100), pContext));
VERIFY(m_splitterWnd.CreateView(1, 0, RUNTIME_CLASS(CViewport), CSize(100, 100), pContext));
VERIFY(m_splitterWnd.CreateView(0, 1, RUNTIME_CLASS(CViewport), CSize(100, 100), pContext));
VERIFY(m_splitterWnd.CreateView(1, 1, RUNTIME_CLASS(CViewport), CSize(100, 100), pContext));
m_splitterCreated = true;
return TRUE;
}
|
|
|
|
|
You are trying in your code to create CView Windows! The way of creating a New View is use:
CDocTemplate::CreateNewFrame
virtual CFrameWnd* CreateNewFrame( CDocument* pDoc, CFrameWnd* pOther );
Goto Scribble to see how
The Document and the View are parts of a complicated suite of software which you got free with the compiler, it is called the MFC Framework, and you cannot in general change something in the middle, without affecting the whole.
Work with MFC, and follow its rules. This means in this case that you get things done in a view by making changes in the underlying document, and notify the view that things have changed. Just follow the scribble tutorial ( And DO SO, even if you have 10 years experience) to see how that's done!
Writing for MFC is not easy,things often must be done "the long way around", but there are benefits to be gained. If you follow the rules, an upgrade to the next window release, generally involves only recompilation. Also any advances in MFC will add functionality to your prrogram by no other means than your customers installing the Next service pack for their operating system.
The alternative is to roll your own! Derrive a Main Frame Class window from CMainFrame, and a Child Window from class CChildFrame, and paint your info by hand as required. Somethimes this is the right way to go! But, if you are trying to paint your own data in a View window, See Scribble
LateNightsInNewry
LateNightsInNewry
|
|
|
|
|
Hmm but that function won't let me specify what kind of view I want to create! I need to specify what view class I wan't to create since it's not the same as in the doctemplate.
|
|
|
|
|
Whilst strFileToRead holds a value of "c:/testfile.txt", the fstream object fileToRead is 'persisting' to read from another file which was previously passed as value to strFileToRead.
Is a way to explicitly clear memory of the previous value? Is this the problem?
void CSentenceAr::readFile(char strFileToRead[MAX_FILENAME_LENGTH])
{
char strLine[MAX_SENTENCE_LENGTH + 1];
fstream fileToRead(strFileToRead,ios::in);
while (!fileToRead.eof() && Size < MAX_LINES)
// Read line of text from file and update Sentences.strSentence.
{ fileToRead.getline(strLine, MAX_SENTENCE_LENGTH);
strcpy(Sentences.strSentence[Size], strLine);
Size++;
}
fileToRead.close();
}
Jon
|
|
|
|
|
I would set a breakpoint at the fileToRead definition, and check the value of strFileToRead on entry to your routine.
Software Zen: delete this;
|
|
|
|
|
It doesn't show any unexpected results.
Jon
|
|
|
|
|
Can I in some way add, let's say an CWnd derived class to a CPropertySheet as a page? What I want to do is to create a CSplitterWnd inside one of the pages.
|
|
|
|
|
I "solved" it with using a CTabCtrl and handle the messages myself. Not very practical though
|
|
|
|
|
Dear friends,
I've a simple MFC application that only consists of a main window. What my application does is that, it launches MS-Word and makes MS-Word window as a child window of my main window.
When the focus is in MS-Word Window, 'operating system' makes its parent window (i.e my main window) as inactive and turns is titlebar as grey. It is so because, though MS-Word window is a child window of my main window, it runs in a separate process.
My main window only becomes active when i click on it. Now the problem is that i want to programatically activate my main window when user is typing in MS-Word window and presses Ctrl+P. My application uses Key board hooking to detect Ctrl+P.
The question is that how do i activate my main window????
I first tried SetActiveWindow API, but it didn't work MSDN doc says abt this API that :
The SetActiveWindow function activates a window, but not if the application is in the background
Obviously my application is in background when focus is in MS word window, so may be thats why this API is not working.
I also tried SetWindowPos and SetForegroundWindow but no result.
Can you suggest me that how do i activate my main window and bring it in the foreground with input focus.
Imtiaz
|
|
|
|
|
I think we have to send some post/send message but i don't know what it is
regards
.GAN.
|
|
|
|
|
Do you need to m_ListCtrl.SetItemState(with LVIS_SELECTED);
|
|
|
|
|