|
Larry Mills Sr wrote: how do you uncheck that radio button?
Send the button a BM_SETCHECK message (CButton::SetCheck() if you are using a
CButton) to set the BST_UNCHECKED state.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Why are you mixing low level calls (CreateFile ) with high level calls (CFile )? Why not let CFile do all the work?
Steve
|
|
|
|
|
I need to have my printer print fields onto a form. So I need to print at precise locations of the form.
I tried using MM_TEXT mode and cannot get the printer to print in exact location.
I am trying MM_LOMETRIC, here are relevant source
r_omap = pDC->SetMapMode (MM_LOMETRIC);
pDC->SetViewportOrg (0,0);
pDC->SetWindowOrg (0,0);
pDC->SetTextAlign (TA_LEFT | TA_TOP);
r_font.CreateFont (-40, 0, 0, 0, FW_MEDIUM, FALSE, FALSE, 0,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Courier New");
when I specify
pDC->TextOut (1200, -140, str, sz);
its moves x wise about 12.4 cm instead of 12
and about 1.9 cm down instead of 1.4
both x and y seem off by about 0.5 cm
What am I missing ?
Henri
I am using Visual C++ 5.0
|
|
|
|
|
Usually what's missing with this is that software and the real world don't match up as precisely as one would like. Most printers don't ever actually see the whole sheet of paper, they're late detecting the top edge and often don't quite see the full width either, that's why they can't print accurately right to the edge of the paper ( a feature now advertised on some newer photo printers ). Most form printing applications I've seen have a user adjustable manual fudge factor prominent on the interface to allow for this. Coding for it is next to impossible because every model of printer is different, not well documented either and the same model can get worse over time due to ageing of spring based top edge detection.
As you've gathered by now trying to print on preprinted stationery without a specialised printer is a mugs game. I wish you luck.
Nothing is exactly what it seems but everything with seems can be unpicked.
|
|
|
|
|
Try calling GetDeviceCaps() on your printer DC to obtain the
PHYSICALOFFSETX and PHYSICALOFFSETY values. Your device may
have a non-printable margin that you need to take into account.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I tried your suggestion, some follow up.
When using Textout (x, y, str, sz); will the printer take location 0,0
from it's margi offsets or from the physical edge of the page.
if PHYSICALOFFSETX return 100
if PHYSICALOFFSETY retunr 100
and I call textOut (0, 0, ...); will printer print from it's margin.
Also GetDevCap for PHYSICALOFFSETX / Y return 100 is that in pixels ?
Because I set MM_LOMETRIC if in Millemter would not make sense.
I do not see any documentation on return values.
Thanks
Henri
|
|
|
|
|
Henri wrote: I tried your suggestion
I can't guarantee that's a good idea
Henri wrote: nd I call textOut (0, 0, ...); will printer print from it's margin.
I believe 0,0 is at the start of the printable area.
If you print there, where does it appear on the page?
Henri wrote: GetDevCap for PHYSICALOFFSETX / Y return 100 is that in pixels ?
It's in device units - pixels/dots.
Henri wrote: Because I set MM_LOMETRIC if in Millemter would not make sense.
Yes. You'll need to use GetDeviceCaps(LOGPIXELSX//LOGPIXELSY) to get avalues to help
you convert between pixels and inches/millimeters.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
First thanks for your help, truly appreciated.
Here's the bottom line I have tried practically all permutations
of mapping modes ... with latest one as shown. Here is the one consistancy, despite the fact that, pDC->GetDeviceCaps (PHYSICALOFFSETX);
pDC->GetDeviceCaps (PHYSICALOFFSETY); are the same (happens to be 100 for both) location 0,0 offset's horizontally 1/8 of inch and vertically 1/4
of an inch. The same happens for any point. Any clues as to why I keep getting this discranpency ?
r_xmargin = pDC->GetDeviceCaps (PHYSICALOFFSETX);
r_ymargin = pDC->GetDeviceCaps (PHYSICALOFFSETY);
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowOrg(0, 0);
pDC->SetWindowExt(600, 600); // logical window is 600 dpi
pDC->SetViewportOrg(0, 0);
// GetDeviceCaps(LOGPIXELSX)and Y are 600
// Device viewport is dpi of actual output device.
pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),
pDC->GetDeviceCaps(LOGPIXELSY));
// r_xmargin and r_ymargin happen to both be 100
pDC->SetTextAlign (TA_LEFT | TA_TOP);
pDC->TextOut (0, 0, "x", 1);
pDC->TextOut (r_xmargin, 100, "x", 1);
pDC->TextOut (r_xmargin/2, 200, "x", 1);
pDC-?TextOut (r_xmargin + 50, 300, "x", 1);
Henri
Thanks again
PS. Feel free to email me at paley007@msn.com
|
|
|
|
|
Do GetDeviceCaps(LOGPIXELSX) and GetDeviceCaps(LOGPIXELSY) give you the same values?
Also, instead of printing text to test this, draw lines or solid blocks.
Your "x" text is immediately going to add some "margin" above the "x"
since it's not a capital letter. Of course, there's more font metrics involved
than just the height. Drawing graphics will give you a much better idea what
you're working with.
What type of printer is it?
Also, check out Matthew Faithfull's comments in his reply above.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Here's a quick sample to plop into a new CScrollView doc/view app to see if the results are consistent using print preview. It's more of a WYSIWYG approach and simplifies printing because it uses the same drawing code to print that is used for the screen. Try this out in a new project then adapt what you need to your application.
NOTE: This was previous post of mine describing the print paging mechanism to someone but it demonstrates general printing. I hope it helps.
//CDocument members...
// Header file .h
protected:
CSize m_DocSize;
// Implementation file .cpp
CSize CYourDoc::GetDocSize() const
{
return m_DocSize;
}
CYourDoc::CYourDoc()
{
// TODO: add one-time construction code here
m_DocSize=CSize(2000,2800);
}
//CScrollView members...
// Header file .h
private:
int m_nPage;
// Implementation file .cpp
CYourView::CYourView()
{
// TODO: add construction code here
SetScrollSizes(MM_TEXT,CSize(0,0)); // Set arbitrary values
m_nPage=1;
}
/***************************************
NOTE: The pInfo parameter is uncommented
****************************************/
void CYourView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* pInfo)
{
// TODO: add extra initialization before printing
pInfo->SetMaxPage(3);
}
void CYourView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
m_nPage=pInfo->m_nCurPage;
CScrollView::OnPrint(pDC, pInfo);
}
void CYourView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
CScrollView::OnPrepareDC(pDC);
// TODO: Add your specialized code here and/or call the base class
// Set up the DC for the current scale factor
int nExtentX;
int nExtentY;
CSize sizeDoc;
CRect rectClient;
pDC->SetMapMode(MM_ISOTROPIC);
// Get pertinent rectangle data
GetClientRect(&rectClient);
sizeDoc=GetDocument()->GetDocSize();
sizeDoc.cy=(-sizeDoc.cy); // Y goes down as it increments
pDC->SetWindowExt(sizeDoc); // Window extent is size of document
// Calculate viewport extent
nExtentX=rectClient.Width();
nExtentY=(int)((nExtentX*sizeDoc.cy)/(sizeDoc.cx));
// What kind of device context do we have?
if (pDC->IsPrinting()==TRUE) {
pDC->SetViewportExt(pDC->GetDeviceCaps(HORZRES),-pDC->GetDeviceCaps(VERTRES));
} else {
// Context is for screen
pDC->SetViewportExt(nExtentX,nExtentY);
}
}
void CYourView::ResetScrollBars()
{
CSize sizeDoc;
CClientDC dc(this);
this->OnPrepareDC(&dc); // Update the device context
sizeDoc=GetDocument()->GetDocSize();
dc.LPtoDP(&sizeDoc); // Logical to device
this->SetScrollSizes(MM_TEXT,sizeDoc); // Update scrollbars
}
void CYourView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
ResetScrollBars();
}
void CYourView::OnDraw(CDC* pDC)
{
CYourDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CSize sizeDoc=pDoc->GetDocSize();
CRect rectOutline(0,0,sizeDoc.cx,sizeDoc.cy);
rectOutline.DeflateRect(10,10); // Ensure we can see it
LOGFONT logFont={0};
memcpy(logFont.lfFaceName,"Arial",6);
logFont.lfHeight=300;
CFont font;
font.CreateFontIndirect(&logFont);
CFont* pOldFont=pDC->SelectObject(&font);
CBrush* pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
CString sMessage;
sMessage.Format("You can add code to center the printout later\nPage %d",m_nPage);
pDC->DrawText(sMessage,&rectOutline,DT_CENTER|DT_WORDBREAK);
pDC->Rectangle(&rectOutline);
pDC->SelectObject(pOldFont);
pDC->SelectObject(pOldBrush);
}
|
|
|
|
|
Hello All
I am using a dialog as my main window, and I set it to center to screen I had put that code in the
this->CenterWindow(CWnd::GetDesktopWindow());
//code here to set dialog size.
on the OnInitDialog
and i dont know how to set width and height of the dialog without using "SetWindowPos"
and i have another issue i want to resize my window and keep it in the center of screen all of that in runtime, due some user clicks.
any help?
|
|
|
|
|
A-M-S-S wrote: and i dont know how to set width and height of the dialog without using "SetWindowPos"
Why do you dislike SetWindowPos ?
A-M-S-S wrote: and i have another issue i want to resize my window and keep it in the center of screen all of that in runtime, due some user clicks.
Can't you handle WM_MOVE message?
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
|
|
|
|
|
CPallini wrote: -- Iain Clarke
I'm a sig! Fame at last!
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
Iain Clarke wrote: I'm a sig
Yes, you're a signore, my friend.
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
|
|
|
|
|
U can Use this OnInit....
<br />
CRect Rect;<br />
GetParentFrame()->GetWindowRect(&Rect);<br />
GetParentFrame()->SetWindowPos( NULL,0,0,900 ,200 ,SWP_NOMOVE | SWP_NOZORDER); <br />
SIZE size;<br />
size.cx=Rect.Width();<br />
size.cy=Rect.Height()/2;<br />
SetScaleToFitSize(size);<br />
"The Ultimate Limit Is Only Your Imagination."
|
|
|
|
|
A-M-S-S wrote: and i dont know how to set width and height of the dialog without using "SetWindowPos"
How about MoveWindow() ?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
You can use of MoveWindow on the WM_SIZE event.
|
|
|
|
|
Hello! I transferred a function from a client program into a windows service. At the client Programm I used PlaySound(WavFile, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); to play a wav file.
At the service there's no output at all. Anyone knows a solution like Setting Default Audio Device via program or another function that could make it work?
Or is there no possibility to do such things?
|
|
|
|
|
I would be doubtful about the ability existing. Can you imagine the consequences if it did?
You'd have all sorts of services deciding that they are the One True Service, making a hullaballoo, and no UI to shut them up. Volume settings are on a per user basis too, I think. So, which user profile do you use?
If noone's logged on, who's going to pay ettention anyway?
I suggest you have a really tiddle client program for the service to communicate with, and let *that* program make the noise - or a balloon tooltip, etc. Then "I" can kill it.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. You wouldn't be the first...
Iain.
Iain Clarke appearing in spite of being begged not to by CPallini.
|
|
|
|
|
MarcoNedwig wrote: At the service there's no output at all.
That's probably a good thing.
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
You're right in saying that it's not so bad that it is this way, but how I would use the service it makes sense in my opinion.
I found a solution to solve my problem, but it's not as good as if I could do the action needed in the service.
The difficulty is that one or more programs consume the service but only one user must play the sound ( a telephone ring).
So I tell one instance via application logic to do it. Quick and dirty Ty for your helpful comments.
|
|
|
|
|
i need to get a file from windows XP machine to my XP desktop, in both machines IIS services running. I have no error in InternetConnect(), InternetOpen(). But FtpOpenFile() fails and returns "file unavailable error". Following is the code i did in FtpOpenFile,
FtpOpenFile(hConnect, TEXT("C:/good.txt"), GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, NULL);
Anybody have any idea to overcome this. Somebody respond ASAP please.
modified on Thursday, February 07, 2008 7:47:52 AM
|
|
|
|
|
vptech19 wrote: FtpOpenFile(hConnect, TEXT("C:/good.txt"), GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, NULL);
Does the file exist? Have you tried a (double) backslash instead?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
|
So now you have something akin to:
if (FtpOpenFile(hConnect, TEXT("C:\\good.txt"), GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, NULL) == NULL)
DWORD dwError = GetLastError();
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|