|
Hi Everyone,
is it possible to embed WxWidgets Controls in a MFC based application?
In detail, is there a way to use wxWidget Controls inside a MFC Control? specially CView, CFormView or CDockablePane?
My problem:
I have a huge MFC appication with rich GUI features.
I need to extend this application with a feature, that user will be able to display application data by creating his own views.
I could start this task with an approach like this:
XUIFramework: A GUI Framework based on XML and MFC[^]
Actually it would work with some simple MFC controls, but there will be a lot of work to make it more functional.
So my basic idea is, to use wxWidgets because of its rich functionality. But I cannot rewrite the complete application to base it on wxWidgets instead of MFC.
An further advantage of wxWidget would be, that it should be very easy to create a runtime for other systems like linux to run the user's GUI!
I have found in internet a few comments about such an approach. some says, it could be possible. But I have not found anything concrete. If I would have a very basic sample, I could start such a project.
Any ideas?
|
|
|
|
|
xx
modified 28-Mar-16 19:50pm.
|
|
|
|
|
Sorry, I think you are in the wrong forum. These forums deal with programming issues, we are not fans of hacking.
|
|
|
|
|
Hello,
is it anyhow possible to mix or overlay MFC Controls in OpenGL controlled screen area?
My aim is as follows:
I have 3D animation (like industrial robot visualisation). Nearby 3D objects I want to display object related information (e.g. with a CListBox Control).
I have already a lot of Controls, based on MFC Controls with enhanced functionality. I want to reuse this at top of a 3D scene?
Any ideas, if it is possible or how I should start?
Many Thanks
Richard
|
|
|
|
|
Write a simple expression evaluator that takes a string like the following as input: 1+2*(3+4).
-Only integers need to be supported
-The following operators should be supported: +, -, *.
-Expressions within parenthesis should be evaluated first.
-Then the resulting expressions should be evaluated from left to right (no operator precedence)
-Example:
4+(4-(2*3)+1)+4 = 7
The code should be written in such a way to support additional operators.
Assume the existence of a function tokenise, which could take a string and return an array of strings, for instance
tokenise(‘1+(2*3)+4’) would return [‘1’,’+’,’(‘,’2’,’*’,’3’,’)’,’+’,’4’]
and the functions isNumber and asNumber which would return a Boolean and integer respectively on a single string input.
modified 17-Mar-16 14:44pm.
|
|
|
|
|
Okay, and?????
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Please don't post the same message in multiple forums.
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
do i get your degree if i do your homework ?
|
|
|
|
|
Chris Losinger wrote: do i get your degree if i do your homework ? I fear he will keep the degree for himself, and even claim tour work is his.
Patrice
“Everything should be made as simple as possible, but no simpler.” Albert Einstein
|
|
|
|
|
And you tried something or you just want us to do your HomeWork ?
Patrice
“Everything should be made as simple as possible, but no simpler.” Albert Einstein
|
|
|
|
|
Well,
We do not do exam questions here. You see, Like it or not, whether you get your degree or diploma, or not, the real test is: 'Can you do the Job.' Degrees and diploma's are there to sort the corn from the chaff. I Myself have no degree in Computer Science, for the simple reason that in the 1970's when I went to university, computers where things that only large government institutions could afford, the cost of each of them involved billions, and no one was allowing students access to expensive things like that. I studied pure mathematics instead. You are damn lucky that you have access to an affordable computer, with a power that is a large number of magnitudes greater than the machines costing billions some 40 odd years ago!
What happened? Did you miss a Semester at College, or what? Also, Is this an exercise in What? It could de C or CPP (My Guess)
Or, if it is MFC, did you write the Interface, and are now stuck for 'Where the Rubber meets the Road'
For you, and, Only for Once, just a bit of a leg up, to do my bit for humanity.
I Suggest you start searching for 'Reverse Polish Notation' (RPN) to at least get you started.
As a Further bit of help, the question does not ask you do the harder part, (writing the Tokeniser)you only have to write code to evaluate it's result. Should not take too much effort.
On pain of being blackballed by fellow members, I remark that you are requested to implement an abstract RPN execution stack.
Success
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: ...implement an abstract RPN execution stack. Did this in undergraduate school. Was a fun exercise.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Well Indeed,
The Real Fun and Complication was to build the RPN instruction List in the first place. This OP was not asked to do that.
Bram van Kampen
|
|
|
|
|
The "official" way to do expression evaluation involves parse trees and reverse Polish notation, but I found a simpler more practical approach: Repeatedly process your list of tokens, making it one step simpler each time by applying a series of rules:
1. If you see the sequence '(', 'number', ')', replace it with just 'number'.
2. For each operator in decreasing precedence, look for the sequence 'number', 'operator', 'number' and replace it with the result of the operation.
If you end up with a single number, that's your answer. Anything else indicates a syntax error in the input expression.
|
|
|
|
|
Hi,
I am still struggling on in Silence with Multiple threads, and See working Code break for no apparent reason following minor Edits.
I have read several articles about it, and, if I take all advice to hart, the answer is "You Can't" The Preferred Method of One Expert leads to grave Demise by another.
I am writing a Dialog Based system where a user Logs In, and, perform certain transactions. I am trying to implement a Controlled Log Out (and return to Base) in the absence of User Activity (Mouse Moves, Clicks, Kb Keys Pressed)
In Adittion, when TimeOut comes Close, a Small ProgresBar+ Message Appears , counting Down, only XX Seconds remaining.
I constructed a New Class, CTimedDialog, and a new App Class, CTimedWinApp. The Latter maintains a list of the m_hWnd of the Dialog Stack, and has a Timer, 1 tick per Second. The 'OnInitDialog' of CTimedDialog (This is a Class that sits between CDialog and the Ultimate UserDialog Class)registers the Class with CTimedWinApp. Upon Time-Out, A Registered Message(WM_TIME_OUT) is '::SentMessage'ed from the timer thread,to the hWnd from the Top of the List, following tru to the bottom, giving each dialog the chance to handle the message, and do a Cleanup (if required), and to close the all dialogs, and, so returning to the Base of the initial menu screen.
In adition, as each Dialog 'Knows' it's timeout value, I set up a separate timer in each CTimedDialog, that initially shows a Progress Bar, and a Text Message to display the remaining time. This timer updates the text with SetWindowText(...) and the ProgressControl with SetProgress(...)
Yes, the Progress Controls had their ranges set.
All worked to perfection when I built a Skeleton Application, of essentially blank Dialogs.
Started to fill in Details, Controls, etc, and the App Clock Ticks are no longer recognised.
Question, Do I have a hard to chase Bug, or, do I do something Wrong.
The Core code involved is quite large, too large to publish here, and covers several files.
I can mail the lot to whoever is interested as a ZIP.
As a Bottom line, there are multiple ways to skin a cat. MFC is capable of multithreading, witness the existence of MS-Office
We need to find the Right way of running Multiple threads in MFC from MS. The guidance for now seems to be: don't
Regards,
Regards
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: Upon Time-Out, A Registered Message(WM_TIME_OUT) is '::SentMessage'ed from the timer thread Don't use SendMessage to send messages from one thread to another. Use PostMessage or SendMessageTimeout instead.
While this probably does not solve your current problem it may avoid future problems.
|
|
|
|
|
Bram van Kampen wrote: Started to fill in Details, Controls, etc, and the App Clock Ticks are no longer recognised. That seems unlikely, unless you are somehow blocking them or throwing them away somewhere. Where do you handle the actual tick messages?
|
|
|
|
|
Well,
I also consider it Unlikely, but that is what both Concept mistakes and stupid Bugs are made of.
The Tick Messages are sent to the Application. The Application has a List of Structures, consisting of: the hWnd of the Dialog, the Default TimeOut, and the Current Count. Upon every tick the Top Count get decremented, and, when it reaches 0, a Registered Windows Message, WM_REG_TIME_OUT is sent to all Dialogs, in Sequence. The CTimedDialog primitive answers to this by a virtual OnDlgTimeOut(), which by default ends the dialog by OnEndDialog(IDABORT). If the Dialog ends for "Natural" reasons, the EndDialog() of CTimedDialog Pops the reference to the Top Dialog of the list, and resets the Current Count of the new Top Object to it's Default value. I have used a CRITICAL_SECTION where needed, but did not go over the top with belts and braces.
The Time-Out bar on the dialogs is more of a debug feature than anything else. It assures me that the clock is ticking, and that things did not deadlock.
Thanks for giving me the foothold for assuring me that I am not doing something fundamentally wrong,as other books and autors seem to suggest. (NEVER mix a Worker and a GUI Thread) my Concept is at least not wrong in your judgement. I Start looking for a stupid mistake somewhere.
Timed and Activity based actions are notoriously difficult to debug.
Stupid Mistakes, (and I made many in the past 60 odd years), are the most difficult ones to find.
I'll let you know when I discover what went wrong. I also think that when I get it right, that the subject is of sufficient interest to merit an article.
Regards,
Bram van Kampen
|
|
|
|
|
Sounds fine to me - but then what do I know, I've only been programming for 50 years.
BTW, that other message that you received from me appears to have been a mis-post by the hamsters.
|
|
|
|
|
Well Richard,
Did not mean to upset you. My native language is Dutch, and, I Don't Do Sarcasm, but Do do Self depreciation.
From what you wrote, I concluded that in your valued judgement, my Basic design is possibly right, but that I made a stupid mistake somewhere in the code base. I responded along these lines
From your response, I think that you think that I was sarcastic in my reply, I was not, I was genuine and tried to reflect on the fact that I am genuinely aware of my own fallibility, and need to start chasing down a stupid mistake I made, in stead of the whole concept being wobbly.
In my experience GDI debugging issues break down into a variety of issues. A first one is, expecting the GDI system to do things that it fundamentally can not. In that case, trying to debug is flogging a dead horse. The best thing there is often to start again, and salvage what you can.
Many bugs are what I call 'Stupid' ones. Hard to Find, but, when found, trivial to resolve. an == ipv an =, or viceversa, Missing or misplaced Brackets, calling a wrong but similarly named function, etc. Well I'm sure you've been there, and can add to the list. In short, things that compile right, but act differently than as intended by the author.
I was grateful that you condoned the model I had, and by extension suggested that I must have made a 'stupid mistake' somewhere. That is far better news than that 'Your Model is Wrong'.
I make 'Stupid mistakes' on a semi regular basis. (I try to avoid the habit for as much as I Can) I think Most Programmers do the same. That's what debugging is for.
Bram van Kampen
|
|
|
|
|
Uh-oh, language problems again.
My sincere apologies, you certainly did not upset me, and I am sorry if my reply sounded sarcastic. When I said "what do I know, I've only been programming for 50 years.", I was being, or trying to be, ironic. The point was supposed to be that even after that much time, I still have a lot to learn, and still make stupid mistakes every day.
As to your problem, I doubt that you have made a stupid mistake, more likely just one of those infernal bugs that are difficult to track down. Lost coun t of the times ...
|
|
|
|
|
Language Problems again indeed.
Sorry for getting the Wrong end of the stick. I call those things 'Stupid'. That reflects my feeling when, after two days stepping trough code into ever deeper levels, I find in the code I wrote a few years ago, deep inside the bowels of working code something like:
if(abc=PQR){ do this }else{ do something else}
Worked fine for three years, Changed something, which (Although I long forgot the details of the How and should call the else,(which of course never happens), and the program breaks at run time.)
You know the run yourself! Working Code, Go tru the documentation, and even when you look at the offending line, you can still overlook it. It Must be There you say. Let's look at the Assembler Code! Hey, the Whole 'if' and 'else' statement have no Code.
At the same time, it worked for years.
You Doubt Compiler Settings, did I have a bad #define somewhere that caused this. Then it dawns! '=' in stead of '=='. (Or some error of that kind)
Then is my bodily reaction to feel Stupid. First of all for not properly testing years ago, but then again, I'm on my own, and there is often pressure of time. One needs to produce something that works, and Our own shop, the main user of the software is often gagging for it. Secondly, for making the typo in the first place. It was not the fact that I did not know the difference between, in this case '=' and '==', but there are other typo's.
Thirdly for not believing that the Compiler compiled correctly. Yes, the beast is near coming of age at 19, but, it is trusty,
and I am aware of it's vagarities.
The Other option is always that I have a Concept Wrong. Something that worked, in the past, but the strict rules were not followed, and the failure to follow the rules comes home to roost. This can ultimately mean re-starting from the beginning, and flushing existing code.
What's new for me is multithreaded programming. I've read quite a few articles on it, and the do's and dont's are so scary and forbidding, one would conclude that multithreading in MFC is all but impossible. At the same time MsOffice95 uses it liberally.
The point is, that I'm fledgling to write stuff like that, and when things go wrong is: Was it a Typo, or, did I fall in One of the Pitfalls. Then there is lack of Information.
Does the Windows Timer Stuff start a New Thread, (if so, of what kind, GUI or Worker), or is it a kludge in the Message System.
At least Peace between us has broken out again. Sorry again that I ever thought different.
BTW always feel free to email me. We may have things in common and experiences in life to share.
Regards
Bram van Kampen
|
|
|
|
|
Yes, been through that more times than I care to remember; but that's all part of the fun.
|
|
|
|
|
Bram van Kampen
|
|
|
|
|
The fact you have been programming for years and the weird behaviour leads me to ask. The usual trap for someone of that experience and first moving into multitasking is not knowing when to use the word "VOLATILE" in front of a variable declaration.
So lets ask the obvious do you know when you have to use "VOLATILE" in some instances and why. The corollary to that is are you sure you haven't missed any in your code given your symptoms.
In normal single thread work you may only have ever run across the word when directly accessing hardware ports but it is far more critical in multitasking. You get symptoms very similar to what you describe.
In vino veritas
|
|
|
|
|