|
Hi guys,
i've been writing a simple app that draws a bitmap held in resource.
The idea Was to move a bitmap from x1 to x2 - simple animation.
I have never met such a problem with WM_PAINT / UpdateWindow,
the animation can be seen only when i drag another application over my form (it refreshes then) - it looks there is a problem with WM_PAINT in my app, can't get it working - any ideas?
Normally 99.9% of my apps (where some drawings are done) are refreshed using:
SendMessage(hWnd,WM_PAINT,0,0);
And after that call, everything is fine, but this time it doesn't work - any tip ?
|
|
|
|
|
You should NEVER update your window using the above method... Instead use:
InvalidateRect(hWnd, NULL, TRUE);
|
|
|
|
|
You should never send WM_PAINT message. This should be invoked by using Invalidate or InvalidateRect.
Use timer and make change of a drawing bitmap here. After that call Invalidate.
For example:
Bitmaps and index value are declared in header file:
CBitmap m_Bitmap[2];<br />
UINT m_uiIndx;<br />
In OnInitDialog bitmaps (array of 2) are loaded and timer set up.
BOOL CSomeDlg::OnInitDialog() <br />
{<br />
CDialog::OnInitDialog();<br />
<br />
m_Bitmap[0].LoadBitmap(IDB_BITMAP1);<br />
m_Bitmap[1].LoadBitmap(IDB_BITMAP2);<br />
<br />
SetTimer(23, 600, NULL);<br />
<br />
return TRUE;
}<br />
Timer sets index of a bitmap and calls Invalidate.
void CSomeDlg::OnTimer(UINT nIDEvent) <br />
{<br />
if(++m_uiIndx > 1)
{<br />
m_uiIndx = 0;<br />
}<br />
Invalidate();<br />
<br />
CDialog::OnTimer(nIDEvent);<br />
}<br />
In OnPaint proper bitmap is displayed
void CSomeDlg::OnPaint() <br />
{<br />
CPaintDC dc(this);
<br />
CDC memDC;<br />
memDC.CreateCompatibleDC(&dc);<br />
<br />
BITMAP bm;<br />
m_Bitmap[m_uiIndx].GetBitmap(&bm);<br />
<br />
CBitmap *pOld = memDC.SelectObject(&m_Bitmap[m_uiIndx]);<br />
dc.BitBlt(15, 15, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);<br />
<br />
memDC.SelectObject(pOld);<br />
<br />
}<br />
JohnCz
|
|
|
|
|
Big thanks for Your help guys.
InvalidateRect(hWnd, NULL, TRUE);
Did the thing.
Grtz.
|
|
|
|
|
Ok, I am stumped, I hope someone out there can help me. FYI I am using Win 98 with VC++ 6.0. I am trying to create a list control to display text output to a window. Since I am new to using the WIN32 API I am trying to create a List Control with some generic text output so I have a working example. I can create the List Control and insert Columns and Items with no problem but when the window is displayed I get no output. I have called ListView_GetItemCount, ListView_GetColumn, and ListView_GetItem macros and can see the info that I have added. I am trying to create the 2nd window in a 2 window app.
What do I need to do in order to display the data in an Edit Window that I have created? I am totally confused on how I get the data to display. I have looked at the List Control articles but I don't see any discussion about this question.
FYI...I have created and displayed the parent window, an edit window and a header control window with no problems.
List Control Create:
HWND CreateSeasonListView()
{
INITCOMMONCONTROLSEX initStruct;
HWND hList;
int nCmdShow;
int nPrevIx;
initStruct.dwICC = ICC_LISTVIEW_CLASSES;
initStruct.dwSize = sizeof(initStruct);
nCmdShow = 1;
nPrevIx = 0;
InitCommonControlsEx(&initStruct);
hList = CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER |
LVS_REPORT,
0,0,CW_USEDEFAULT,CW_USEDEFAULT,HWndSeason,NULL,hInstGlobal,NULL);
return(hList);
}
Insert Items Into List Control:
void AddListItems ()
{
#define LIST_COLUMNS 6
static LVCOLUMN lvCol[LIST_COLUMNS];
static LVITEM lvRow;
static LVITEM lvTest;
LRESULT rc;
LPSTR psText[LIST_COLUMNS];
LPSTR pItem;
char cHdg [LIST_COLUMNS] [11] = {"Date",
"Game 1",
"Game 2",
"Game 3",
"Avg",
"Total"};
char cTxt[20];
int iColHdgLen[LIST_COLUMNS] = {4,6,6,6,3,5};
int itest;
int x;
int nCmdShow = 1;
HDC hDC;
bool btest;
HWND hEdit;
char temp[255];
rc = -5;
pItem = NULL;
memset(temp,0,sizeof(temp));
ZeroMemory(&lvCol,sizeof(lvCol));
ZeroMemory(&lvRow,sizeof(lvRow));
for (x = 0;x < LIST_COLUMNS; x++) {
lvCol[x].mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
lvCol[x].fmt = LVCFMT_LEFT;
lvCol[x].cx = 100;
lvCol[x].pszText = LPTSTR(cHdg[x]);
lvCol[x].cchTextMax = iColHdgLen[x];
lvCol[x].iSubItem = x;
lvCol[x].iImage = NULL;
lvCol[x].iOrder = x;
itest = ListView_InsertColumn(HWndSeasonList,x,&lvCol[x]);
}
lvRow.mask = LVIF_TEXT | LVIF_PARAM;
lvRow.iItem = 0;
lvRow.iSubItem = 0;
pItem = (LPSTR) malloc(20);
memset(pItem,0,20);
memcpy(pItem,"01/29/05",8);
lvRow.lParam = (LPARAM) pItem;
lvRow.pszText = pItem;
lvRow.cchTextMax = strlen(pItem);
itest = strlen(pItem);
rc = ListView_InsertItem(HWndSeasonList,&lvRow);
/* NOTE: I have tried this both ways shown below and neither
one seems to work (Nothing is displayed in the window.
rc = SendMessage(HWndSeasonList, WM_SETREDRAW, TRUE, 0);
btest = InvalidateRect(HWndSeasonList,NULL, TRUE);
btest = UpdateWindow(HWndSeasonList);
*/ btest = ShowWindow(HWndSeason,SW_NORMAL);
UpdateWindow(HWndSeason);
Error = GetLastError();
}
|
|
|
|
|
I'm wondering if I'm doing my message handling all wrong. Currently
when I send my thread a messages (using postthreadmessage from my main
app.) I handling it in the PreTranslateMessage function. While reading
the MSDN I noticed that it said that all messages come in to the run
function and are then passed on to the PreTranslateMessage function.
Is this true? What are the remifications of leaving it like it is if
it's working?
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Hello,
I have this asynchronous pluggable protocol handler (apph) that I'm trying to integrate into a an MFC application.
I've based my view on CHtmlView and call the apph using the Navigate2 method.
This works as expected.
Now, the apph is designed that - at initialization - you have to call a routine to set some variables (current path, ...).
These are statically stored inside the apph to make them persistant for the life of the apph.
The problem I'm facing is this:
After a few minutes of inactivity of my MFC application, MSHTMLED.DLL gets unloaded which also unloads the apph.
Whenever I try to click a link in my MFC application, it will fail from now one, as the apph was unloaded (and the static variables are gone). The apph is automatically loaded after clicking the link though, but the initialization phase is skipped of course.
Question: is there any way so I can MFC in tricking not to unload my protocol handler?
Thanks in advance
Wim
|
|
|
|
|
I beleve not many of you had this kind of problem but if anyone knows what shoud I do it would be great. I am writing an application in Serbian language and that includes writing some non-English letters such as: Š, Đ, Ž, Ć and Č. Everything works fine but with the last two. They look fine inside the code but when I compile it they turn into C. I've tryed with different regional options and different encoding but nothing helped. I'm out of ideas and my deadline is coming closer and closer every day, so if anyone knows how to solve this one please help.
--Nikola--
modified 7-Dec-20 21:01pm.
|
|
|
|
|
While not the best solution, I have found that this type of problem can sometimes be solved by encodeing the value of the character into the string instead of the character itself.
Example: pAcuteC = "\x6A";
Of cource what character is actualy displayed is character map dependent.
I doudt if that helped, but good luck just the same!
INTP
"The more help VB provides VB programmers, the more miserable your life as a C++ programmer becomes."
Andrew W. Troelsen
|
|
|
|
|
I'm reading a text-file. Looks like this:
name= "Test";<br />
mass= 5000;<br />
MountPoints= 3;
In the code I've got this:
label = group + '/';
These variables are of type std::string.
At this point group contains "Vehicle". When label contains "name" or "mass" the label is correctly reseted to "Vehicle/". But when it comes to "MountPoints" it just sets it to ??? (According to the watch in VS). If I in the text-file cut down that row to just "MountPo", it works. Why??? Anyone knows?
|
|
|
|
|
How big is the variable that you are using to read the file? Seem highly significant to me that Vehicle and MousePo are the same size.
Artificial intelligence is no match for natural
stupidity.
|
|
|
|
|
Hm, I didn't notice that they were of the same length...
I use this to open the file:
ifstream theFile;<br />
theFile.open(fileName);
And this to read:
while (tempChar = theFile.get())<br />
{<br />
...<br />
label += tempChar;<br />
...<br />
}
Both label and group are of type std::string. I thought that these strings adjusted their size as needed.
|
|
|
|
|
Anyone else got any idéas? I really can't figure this out, doesn't use the string-class so often.
If the read label is more than seven characters long, the row
label += group + '/'
makes "label" get the value '???'
"group" contains 'vehicle' at the given moment...
|
|
|
|
|
I wrote a screensaver that mutes the volume using a call to mixerOpen followed by all the other relevant calls to get the ID of the MIXERCONTROL_CONTROLTYPE_MUTE. It works fine on my Windows98 machine, muting the sound perfectly. However it never works on WindowsXP, I believe that the mixerOpen function keeps failing. Does anyone have any ideas of how to mute the sound on XP. Unfortunately I don't have an XP machine that I can develop on.
|
|
|
|
|
If mixerOpen() fails, it will return a specific error code. What is that error code?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
mixerOpen() returns 2. I can't look up what MMSYSERR that is right now, as I don't have VC++ on the XP machine. As I said though, it works fine on 98.
|
|
|
|
|
It appears to be MMSYSERR_BADDEVICEID . What does the call to mixerOpen() look like?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Thanks for the help DavidCrow, but I got it fixed now. I was calling mixerOpen like this
if (mixerOpen(&hMixer, MIXER_OBJECTF_HMIXER, 0, 0, 0) != MMSYSERR_NOERROR)
return FALSE;
It worked on Windows98, but not on XP, only when I re-read the documentation did I change the second parameter to 0.
|
|
|
|
|
I am a beginner at Visual C++. I created an editbox with an dword variable. I would like to enter hexadecimal values in the format for example 004FD210 and i want the corresponding variable for the editbox or (maybe with a small code others) to have corresponding decimal value. I thought to read into a string andthen to convert it to integer value. But is there a shorter way. Pls.
|
|
|
|
|
converting string to interger: value strtol(), strtoul().
converting interger value to hex string: sprintf(pStr,"%X",nValue).
If you want to convert to hex string with leading 0's:
sprintf(pStr,"%8.8,X",nValue); // 00000000
Or
sprintf(pStr,"%*.*,X",8,8,nValue); // 00000000
I believe those should work for ASCII formated string.
INTP
"The more help VB provides VB programmers, the more miserable your life as a C++ programmer becomes."
Andrew W. Troelsen
|
|
|
|
|
Hi all,
I am writing a program that continuously stores data from an external memory.
while(isConnected)
{
// Do stuff over here
}// end while
However, when it runs, it takes all the memory (program is not responded).
I have another button (Stop) to call method to set isConnected to False in order to get out of the loop. However, I didn't even have a chance to hit that button because the program is freezed.
Any suggestions? Thanks.
|
|
|
|
|
|
Use a worker thread. If you don;t thread the application, then the reason you're locking the program up is because the Message Loop never has the chance to run, and therefore the button press is never noticed. Use a thread for the user interface, and one to do the loop.
|
|
|
|
|
An alternative is to pump the message queue every n iterations of the loop. There is no need to create a worker thread.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
Hello,
I'm writing to ask some explanations on the excellent article "Using Custom Controls in a Dialog Bar" by Douglas R. Keesler, see http://www.codeproject.com/useritems/DerivedDlgBar.asp. Maybe that I did not understand everything, I'm french and my english is not so good.
So my matter is about how to create a menu in a CDialogBar :
I have made a little MDI which has got a CDialogBar with VC++6.0 .
In this class, I want to put a Menu.
So I made that you said :
- create a CDialogBar : IDD_DLGBAR_TEST ,
- create a Menu in my ressource : IDD_DLGBAR_TEST ,
- create the class MyDlgBar (import files MyDlgBar, remove file.clw and clic on ctrl+w to wizard VC6.0 as he said)
- select to this ressource the classe MyDlgBar
- put in the class CMainFrame the instance : CMyDlgBar m_dlgBarTest
- put the creation of this box in the create function of the CMainFrame with :
m_dlgBarTest.Create(this, IDD_DLGBAR_TEST, <br />
CBRS_RIGHT | CBRS_GRIPPER |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,<br />
IDD_VIEW_MENU_DLGBAR)
- I put, in the message map of my CMainFrame, the 2 lines :
ON_COMMAND_EX(IDD_VIEW_MENU_DLGBAR, OnBarCheck)<br />
ON_UPDATE_COMMAND_UI(IDD_VIEW_MENU_DLGBAR, OnUpdateControlBarMenu)
- then I compile and I built my application.
When I execute this application, I have got :
- the main frame
- the floating dialog box (CDialogBar)
But I haven't got the menu of this floating box !
I search in the source of the demo project but I don't see the menu that we could see in the article.
Perhaps the autor forgot to write something to realize a menu in a CDialogBar?
Or perhaps I don't understand all ...
Could you explain to me how to realize it ?
Thanks very much to help me !
Alice
|
|
|
|
|