|
The MidiPlyr PSDK sample has code which scales the timer text so it fills the window (not very well mind you). It's located in Samples/Multimedia/Audio/MidiPlyr/uiutils.c:EmbossedTextOut() and CreateScaledFont(). 80% chance that the scaled font feature (and all of uiutils.c) was created as an extra credit assignment.
But anyway, the API to use is GetTextExtentPoint32.
-- modified at 11:43 Thursday 9th March, 2006
|
|
|
|
|
Thanks. I know about GetTextExtentPoint32. Unfortunately the problem is getting windows to use a reasonable font size. It appears that windows only has a few font sizes, and there's no provision or way to smoothly scale up or down without jumps in sizes. This means that sometimes the font matches the rect just fine, others it's too small, and other times it's too big. I'll look into the example though!
¡El diablo está en mis pantalones! ¡Mire, mire!
Real Mentats use only 100% pure, unfooled around with Sapho Juice(tm)!
SELECT * FROM User WHERE Clue > 0
0 rows returned
Save an Orange - Use the VCF!
|
|
|
|
|
The MidiPlyr sample also has this problem. It doesn't fully scale to the window, hence the jumps in font size you see.
So if Microsoft, for all their wealth, power and unrestricted access to the Windows source code, can't get it right, what hope do we poor insignificant developers who get the scrap heap public API, have ?
|
|
|
|
|
a little bit confused by ur post:
every row must contain 80 characters or differnt (max is 80)? all rows use same font? "display" means by paint (CDC etc) or text control (CEdit etc)?
A nice tool for optimizing your Microsoft html-help contents.
Includeh10
|
|
|
|
|
Hi everyone.
Can someone point me in the right direction to find an answer to a problem I have been posed by my boss!
We have approx 150 PCs (Win95 & 98), each running software which puts audio (16kHz sample rate, 8 bit ulaw)out of the parallel port into our own DAC board.
We wish to install NetMeeting in all these machines so that a VoIP call can be made to them from a central PC. The problem is that there are no soundcards fitted!
Any incoming audio (from Netmeeting) will need to be routed to the parallel port. Is it possible for NetMeeting to work without a soundcard?
Where would I need to start - is it a case that a specific codec would be need to be written to do this? If so is it a simple task? I am asuming that the source audio will be encoded at the same sample & bit rates as our DAC uses.
It would be perfectly adequate for the incoming audio to be simply put into a file, which I could then read and then write out of the parallel port.
My skills as a programmer are relatively low, is it something that a 'novice' can achieve?
I will have approx 10 weeks of full time work to achieve this - could it be done in this time?
I hope someone out there can point me in the right direction - or to the right forum!
Thanks for any help
Mike
|
|
|
|
|
69 Bay wrote: My skills as a programmer are relatively low, is it something that a 'novice' can achieve?I will have approx 10 weeks of full time work to achieve this - could it be done in this time?
You'll have to write a device driver to make the parallel port look like a sound card. Yes, it's possible, but depending on your skill level will probably take longer than 10 weeks, particularly since device drivers are notoriously difficult to debug.
Unless there's a strong reason not to, it would probably be cheaper for the company to put a cheap sound card ($10-20) in each computer, than to pay your wages for 10 weeks (or possibly longer) when you could be doing other stuff more suited to your abilities (yes, I'm assuming a lot here... I don't mean to offend).
If you do go the route of developing a driver, Toby Opferman has got a great series of articles on device driver development here[^]. Other resources may exist on the net. Ask google for a hand
Good luck!
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Thanks Ryan
I will start looking at how to write device drivers!
The thinking behind doing this was that our customer wants the update, but will probably (if a sound card is required), pay one of his own engineers to go round and install the sound cards. If we could do the update without a sound card, we could then charge a bit more for the job, but he would pay less overall as he wouldnt need to update all the PCs
Thanks for your advice, now to look at how to do device drivers!
Mike
|
|
|
|
|
Hi, does anyone know how to change/mute the windows volume in xp?!
thanks,
Mark
|
|
|
|
|
did u try searching[^] for it
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
|
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
don't mind, he drank too much today...
|
|
|
|
|
yea. I found a couple of samples, but I didnt recognise the code. Im quite new to c++. I think it was MFC, which I dont have any experience with. I have searched everywhere on the net, but just cant find it anywhere.
Do you have any ideas?
Thanks,
Mark
|
|
|
|
|
This is the CMute.h file
class CMute
{
public:
UINT m_nNumMixers;
HMIXER m_hMixer;
MIXERCAPS m_mxcaps;
DWORD m_dwMuteControlID;
BOOL amdUninitialize();
BOOL amdInitialize();
BOOL amdGetMasterMuteControl();
BOOL amdGetMasterMuteValue(LONG &lVal) const;
BOOL amdSetMasterMuteValue(LONG lVal) const;
};
this is the CMute.cpp file
BOOL CMute::amdInitialize()
{
ASSERT(m_hMixer == NULL);
m_nNumMixers = ::mixerGetNumDevs();
m_hMixer = NULL;
::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS));
m_dwMuteControlID = 0;
if (m_nNumMixers != 0)
{
if (::mixerOpen(&m_hMixer,
0,
reinterpret_cast<DWORD>(this->GetSafeHwnd()),
NULL,
MIXER_OBJECTF_MIXER | CALLBACK_WINDOW)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
if (::mixerGetDevCaps(reinterpret_cast<UINT>(m_hMixer),
&m_mxcaps, sizeof(MIXERCAPS))
!= MMSYSERR_NOERROR)
{
return FALSE;
}
}
return TRUE;
}
BOOL CMute::amdUninitialize()
{
BOOL bSucc = TRUE;
if (m_hMixer != NULL)
{
bSucc = (::mixerClose(m_hMixer) == MMSYSERR_NOERROR);
m_hMixer = NULL;
}
return bSucc;
}
BOOL CMute::amdGetMasterMuteControl()
{
if (m_hMixer == NULL)
{
return FALSE;
}
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if (::mixerGetLineInfo(reinterpret_cast<HMIXEROBJ>(m_hMixer),
&mxl,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
if (::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(m_hMixer),
&mxlc,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINECONTROLSF_ONEBYTYPE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
m_dwMuteControlID = mxc.dwControlID;
return TRUE;
}
BOOL CMute::amdGetMasterMuteValue(LONG &lVal) const
{
if (m_hMixer == NULL)
{
return FALSE;
}
MIXERCONTROLDETAILS_BOOLEAN mxcdMute;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwMuteControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
mxcd.paDetails = &mxcdMute;
if (::mixerGetControlDetails(reinterpret_cast<HMIXEROBJ>(m_hMixer),
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_GETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
lVal = mxcdMute.fValue;
return TRUE;
}
BOOL CMute::amdSetMasterMuteValue(LONG lVal) const
{
if (m_hMixer == NULL)
{
return FALSE;
}
MIXERCONTROLDETAILS_BOOLEAN mxcdMute = { lVal };
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwMuteControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
mxcd.paDetails = &mxcdMute;
if (::mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(m_hMixer),
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
return TRUE;
}
i just copied from a tutorial and pasted (with a few changes should work)
add these two files to the project
hope it helps
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
is that MFC?
What are all the '::'?! I think I may be using something else... i take it i wont be able to combine the two in one program?
Thanks for the help!
Mark
|
|
|
|
|
markhaslehurst wrote: What are all the '::'?!
its not MFC its simple C++. :: is scope resolution operator.
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
oh right. ok. because ive only started to learn c++ in the last couple of weeks, and i didnt really know the difference between MFC and normal c++... since I never saw those symbols in what i was doing, i figured they were an MFC thing...
That all makes a lot more sense now, lol! Thanks!
So why would one want to hide a class type?
Thanks,
mark
|
|
|
|
|
markhaslehurst wrote:
Hi, does anyone know how to change/mute the windows volume in xp?!
See here.
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|
|
Ah! That looks more understandable... so is MFC basically the same, just with different top-level structure?
Thanks!
Do you know how to mute it (other than setting the volume to 0) - as in, similar to checking the 'mute all' option in windows?
Thanks a lot!
Mark
|
|
|
|
|
markhaslehurst wrote: ...is MFC basically the same...
As what?
markhaslehurst wrote: Do you know how to mute it (other than setting the volume to 0) - as in, similar to checking the 'mute all' option in windows?
No, I've never looked.
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|
|
as visual c++... or im guessing there is another type of c++, apart from mfc... are they v different?
ok. well thanks a lot for that link. its proving really useful... just trying to figure out how to increment the volume at the moment!
Thanks a lot for your help!
Mark
|
|
|
|
|
Visual C++ is Microsoft's implementation of C++.
MFC is a collection of classes, most of which act as a wrapper around the Win32 API. There are classes for many of the handle-managed Windows objects and also for predefined windows and common controls. MFC provides an OO programming model to the Win32 API. See here.
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|
|
oh right. lol. yea. i just kinda decided to jump right into what i wanted to do and skipped over all the basics, so i didnt know any of that!!
thanks for explaining! it all seems so much more logical now!?!
Thanks for being so patient with me!
Mark
|
|
|
|
|
Woo! OK. Ive sorted it out. I can now increment, decrement and mute windows volume! Thanks a lot to everyone for all your help!!
Really appreciated!
Mark
|
|
|
|
|