|
I remember reading an article about how to correctly program for all font sizes and DPI's (eg. 96 and 120), but I can't find the article anywhere (it may not even be on CP).
Can anyone help me with a link to an article, or even book reference, about making your UI compatible for all font sizes and DPI's ?
|
|
|
|
|
|
Thanks David!
|
|
|
|
|
Hello
If any one has MFC Internals Ebook, by Scott wingo, I would request you to share the same with me.
Thanks in advance
Ritesh
Ritesh
|
|
|
|
|
Are you offering payment?
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Yes, I will pay you, if you can give me a softcopy of MFC internals.
|
|
|
|
|
Share your desktop, we'll share you.
OK,. what country just started work for the day ? The ASP.NET forum is flooded with retarded questions. -Christian Graus
Best wishes to Rexx[^]
|
|
|
|
|
Please share you money with us...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Hi,
I need to let admin-user to change local area connection properties with in the program.
the program is written in mfc/c++.
currently i have an ugly piece of code that works only if i know the type of the card - as you can see in the OR statement. I found out that wireless cars always have "Wireless" in their name, however I couldn't find anything similar for LAN cards, any ideas?
Thanks!
Sky
CString LanIp,WLanIp;
CString Descr,ServiceName;
DWORD regEnumIndex = 0;
DWORD IPwasChanged = FALSE;
CString Value;
CRegistry Reg (HKEY_LOCAMACHINE);
CStringArray IpConfigPath;
CString IpAddress;
CString Key1("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\");
CString Key2("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
CEntity *Entity = m_pMgr->GetMyEntity();
if(Entity != NULL)
{
((CLanEntity *)Entity)->GetLanIP(LanIp);
((CLanEntity *)Entity)->GetWLanIP(WLanIp);
IPwasChanged = FALSE;
while(1)
{
if(Reg.EnumKey(Key1,regEnumIndex,Value) == FALSE)
break;
Reg.Get(Key1 + Value,"Description", Descr);
if(Descr.Find("Wireless") >= 0)
{
if(WLanIp == "0.0.0.0" || WLanIp == "")
continue;
Reg.Get(Key1 + Value,"ServiceName", ServiceName);
Reg.Get(Key2 + ServiceName,"IPAddress", IpAddress);
if(WLanIp == IpAddress)
continue;
Reg.Set(Key2 + ServiceName,"IPAddress", WLanIp);
Reg.Set(Key2 + ServiceName,"SubNetMask", _T("255.255.255.0"));
Reg.Set(Key2 + ServiceName,"IPAutoconfigurationEnabled", 0);
Reg.Set(Key2 + ServiceName,"EnableDHCP", 0);
IPwasChanged = TRUE;
}
if(Descr.Find("PRO/100") >= 0 || Descr.Find("Realtek") >= 0 || Descr.Find("Marvel") >= 0)
{
if(LanIp == "0.0.0.0" || LanIp == "")
continue;
Reg.Get(Key1 + Value,"ServiceName", ServiceName);
Reg.Get(Key2 + ServiceName,"IPAddress", IpAddress);
if(LanIp == IpAddress)
continue;
Reg.Set(Key2 + ServiceName,"IPAddress", LanIp);
Reg.Set(Key2 + ServiceName,"SubNetMask", _T("255.255.255.0"));
Reg.Set(Key2 + ServiceName,"IPAutoconfigurationEnabled", 0);
Reg.Set(Key2 + ServiceName,"EnableDHCP", 0);
IPwasChanged = TRUE;
}
}
}
|
|
|
|
|
skydiver135 wrote: I need to let admin-user to change local area connection properties with in the program.
Why can't they just use the Windows Admin Tools?
led mike
|
|
|
|
|
At my previous employer I was often working on network related code and was changing my IP address every 5 minutes for 8 hours. As you can imagine this grew tiring so I spent a weekend writing an application to change my network settings in a single mouse click to one of several options.
Here is a function I pulled from that application:
BOOL CNetworkToolBox::GetNetworkCardsFromIpHlpAPI(CStringArray *szCards)
{
BYTE *pBuf=NULL;
DWORD dwSize=0;
DWORD dwResult=0;
BOOL bConnected=FALSE;
PMIB_IFTABLE pMIBTable;
CString str;
GetIfTable(NULL,&dwSize,FALSE);
pBuf=new BYTE[dwSize];
pMIBTable=reinterpret_cast <PMIB_IFTABLE>(pBuf);
if(NO_ERROR == GetIfTable(pMIBTable,&dwSize,FALSE))
{
for(UINT i=0; i < pMIBTable->dwNumEntries; ++i)
{
if(MIB_IF_TYPE_LOOPBACK != pMIBTable->table[i].dwType)
{
if(MIB_IF_OPER_STATUS_CONNECTED == pMIBTable->table[i].dwOperStatus
|| MIB_IF_OPER_STATUS_OPERATIONAL == pMIBTable->table[i].dwOperStatus)
{
str.Format("%d@%s",pMIBTable->table[i].dwIndex,pMIBTable->table[i].bDescr);
szCards->Add(str);
}
}
}
}
delete []pBuf;
return bConnected;
}
You can check the dwType member of the MIB_IFROW Structure[^] and look for the value IF_TYPE_IEEE80211 which designates the interface as wireless. All other cards would be physical/virtual. I am using the IP Helper Library so you will need to include the following:
#include "Iphlpapi.h"
#pragma comment(lib, "iphlpapi.lib")
Btw, there are better ways to set the interface options than raw registry.
Best Wishes,
-David Delaune
|
|
|
|
|
It's possible that WMI[^] might be a better, more reliable approach.
This article[^] shows why WMI is better than searching through the registry for system information.
|
|
|
|
|
I have a question about CSocket and thread.
I have an application server C++/MFC (Visual Studio) that need to have 300 connection always open.
My server receive data from industrial machines and save data into a remote database.
On internet i have seen that many programmers use a thread for every connection that is open.
My application don't create directly a thread for every connection.
I only create a new CSocket object when i receieve a new connection request (i have a csocket that listen for this request).
So i have a list of 300 CSocket object.
I see that operating system / MFC library call OnReceive when machines send data to my server.
Inside the OnReceive() i write machine data in a dedicated file (there is a file for every industrial machine) .Another thread (this is the only working thread that i have created, reads sequentially all these files, do some computations and then sometimes write info into an SQL database.
So, my appliaction has a User Interface thread (created by the Visual studio framwork), a working thread that execute a loop to read all machine files to see if there is new data.
Then there are all these CSocket object that in an asyncronous way execute OnReceive to save data from machine into its file.
I am not sure that this is a good archietecture because with 300 connections my application has become slow.
May be that if i create a separate thread for every connection performance improves ?
When i create a csocket object indirectly i create a thread ?
Which is the difference ?
Thank you for your attention.
Emanuele.
|
|
|
|
|
|
My networking era ended without me actually trying out I/O completion ports.. That's there for years in my to-do list.
OK,. what country just started work for the day ? The ASP.NET forum is flooded with retarded questions. -Christian Graus
Best wishes to Rexx[^]
|
|
|
|
|
Once you get the hang of using them, they work extremely well.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thank you for your reply.
Emanuele.
|
|
|
|
|
popacio wrote: I am not sure that this is a good archietecture because with 300 connections my application has become slow.
May be that if i create a separate thread for every connection performance improves ?
I would not recommend creating 300 threads. Your probably not going to gain anything by doing this, context switching will be very high along with increased memory usage. Your bottleneck is using 300 instances of the high level CSocket Class[^]. You would have a tremendous performance gain by using Overlapped I/O and an event based model using i/o completion ports[^]. This would also increase your scalability, in the future your employer may ask you to increase the data logging capability to double the network nodes.
Here is a fairly good read over at MSDN regarding I/O Completion Ports.[^]
Len Holgate has released a free version of his IOCP based, socket server framework[^] if your interested.
There is also the Boost.Asio library by Christopher Kohlhoff[^]. I have used both libraries, they seem to have similar performance although I did not comparatively benchmark them.
Best Wishes,
-David Delaune
|
|
|
|
|
Thank you for yout reply.
Emanuele R.
|
|
|
|
|
Hi,
This app is written in C++ without MFC.
My question is this:
Let's say my app is not full screen, and a user clicks the top bar of the app and drags it around the screen. Is there a windows message that gets sent back to my main app's message pump to tell me when the window is moving? like WM_<somethingorother> etc? I have been looking over MSDN and other documentation and I have not been able to find anything like this but maybe I am missing something.
If it does not send a message, is there any other way that I can tell when the app is being dragged around?
Thanks!
KR
|
|
|
|
|
Are you looking for WM_MOVING[^]?
Best Wishes,
-David Delaune
|
|
|
|
|
That is what I needed, thank you!!!
KR
|
|
|
|
|
My boss asked me to try to fix V studio on one of our computers and I cant find anything on the web thats very helpful. Anytime you try to add a file to a project to errors pop up. The first is the Studio has encountered a problem wih the details.
"AppName: msdev.exe AppVer: 6.0.8168.1 ModName: devshl.dll ModVer: 6.0.8168.0 Offset: 0003eaed"
These second is an application error:
Instruction at "0x73dd11c7" referenced memory at "0x00000004", the memory could not be "read".
Just wondering if anyone else has experienced this problem and new a quick fix, im probably goin to reinstall Visual Studio and see if that works.
|
|
|
|
|
Do you have any 3ed party visual studio addins installed? If yes, try uninstalling them at first.
Regards,
Jijo.
_____________________________________________________
http://weseetips.com[ ^] Visual C++ tips and tricks. Updated daily.
|
|
|
|
|