|
led mike wrote: Is that important?
To me, yes, since AFAIK, Windows will not create the directory
if it doesn't exist.
But I can't speak for the OP
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Yes the folder does exist
A C++ programming language novice, but striving to learn
|
|
|
|
|
Well in that case, I haven't a clue
I tested your exact code (on Vista) -
It failed when the directory didn't exist, but succeeded after
I manually created the folder in Windows Explorer.
Are you sure everything is spelled right?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Are you sure everything is spelled right?
Is that important?
led mike
|
|
|
|
|
|
ROTFLMAO
I saw that repost and you guys replying but I didn't check out the links you gave, I assumed you both linked to real resources!
led mike
|
|
|
|
|
It was my mistake. a "Typeof" error. thanks
A C++ programming language novice, but striving to learn
|
|
|
|
|
Larry Mills Sr wrote: // destroying the CObject here will call ::CloseHandle() on the file
That is an incorrect assumption.
The CFile constructor which takes a HANDLE as an argument sets
a flag m_bCloseOnDelete = FALSE. This causes the handle NOT to be closed
when the destructor is called!
You need to close it yourself.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I called myFile.Close(); instead. I tried ::CloseHandle() after myFile.Close(); and the compiler didn't like it so I just used myFile.Close().
Mark I have another problem: I have a series of radioboxes (not grouped) and I can find out which one is selected by the ON_BN_CLICK, but exactly how do you uncheck that radio button? the MSND is confusing on that issue to me.
by the way, I found the mistake. It was my error. Works now.
A C++ programming language novice, but striving to learn
|
|
|
|
|
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
|
|
|
|
|