« November 2005 »
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
You are not logged in. Log in

Programming Tips
Tuesday, 15 November 2005
Repainting immediately!
Mood:  bright
Topic: VC++
Many times it happens that when we call Invalidate(TRUE /*or FALSE*/) the window is not refreshed immediately. 
It happens because Invalidate() simply marks an area to be repainted. 
The area will be painted only during the next WM_PAINT message. This message won't be immediately fired 
if there is another blocking event taking place. Now you should be knowing why it didn't repaint immediately. 
:)

So now what to do if we wish to refresh the window immediately.
Simply do this!

Invalidate(TRUE);//marks the window to be painted
UpdateWindow();//by passes the message queue and paints immediately

Don't forget to call Invalidate() before UpdateWindow() or else the window will not be refreshed. 
The reason being that your region is not marked to be refreshed. 


Posted by Nibu babu thomas at 12:02 PM
Updated: Tuesday, 15 November 2005 12:07 PM
Monday, 14 November 2005
To retrieve the ID of any window.
Mood:  sharp
Topic: VC++
This is how we can retrieve the ID of any window.

	LONG lWndID = ::GetWindowLong(this->m_hWnd, GWL_ID);
Simple!

Posted by Nibu babu thomas at 5:01 PM
Window style modification at runtime
Mood:  sharp
Topic: VC++
Here is how you can change the style of any control of at runtime. Here we are modifying the style of a top level window like a 
dialog or a frame window to display a maximize button if there is not one already.

	LONG lCurStyle = GetWindowLong(this->m_hWnd, GWL_STYLE);
     	SetWindowLong(this->m_hWnd,
		GWL_STYLE,
		lCurStyle|WS_MAXIMIZEBOX, SWP_FRAMECHANGED);

The second argument in SetWindowLong and GetWindowLong gives the index of the activity that the functions has to deal with. 
Here GWL_STYLE specifies that the functions have to deal with the style index.
For further details take a look in the MSDN documentation

Posted by Nibu babu thomas at 4:24 PM
Updated: Monday, 21 November 2005 1:59 PM
Thursday, 10 November 2005
Screen resolution
Mood:  incredulous
Topic: VC++
We can get the screen resolution as follows:

int xScreenRes = ::GetSystemMetrics(SM_CXSCREEN);
int yScreenRes = ::GetSystemMetrics(SM_CYSCREEN);

Yeah you have it!

Posted by Nibu babu thomas at 4:42 PM
Updated: Thursday, 10 November 2005 4:43 PM
How to get the height and width of a bitmap?
Mood:  energetic
Topic: VC++
It's real easy to retrieve the height and width of a bitmap. Trust me, take a look.

CBitmap cbBmp;
cbBmp.LoadBitmap(IDB_BITMAPID);
BITMAP bmpInfo;
//clear bmpInfo
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
cbBmp.GetBitmap(&bmpInfo);

There is another way of going about this. Take a look:

CBitmap cbBmp;
cbBmp.LoadBitmap(IDB_BITMAPID);
BITMAP bmpInfo;
//clear bmpInfo
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
cbBmp.GetObject(sizeof(bmpInfo), &bmpInfo)

//now get the height and width...
int bmpHeight = bmpInfo.bmHeight;
int bmpWidth = bmpInfo.bmWidth;


See I told you it's easy.

Posted by Nibu babu thomas at 3:48 PM
Updated: Thursday, 10 November 2005 4:48 PM
Quick way of changing background color of edit controls
Mood:  cheeky
Topic: VC++
Windows provides us a way to override the look and feel of a component at runtime throught this method. 
For more information take a look at the MSDN documenation on 
OnCtlColor().

The nCtlColor parameter contains the category of the control being painted, for eg:

CTLCOLOR_BTN -- Button control 
CTLCOLOR_DLG -- Dialog box 
CTLCOLOR_EDIT -- Edit control 
CTLCOLOR_LISTBOX -- List-box control 
CTLCOLOR_MSGBOX -- Message box 
CTLCOLOR_SCROLLBAR -- Scroll-bar control 
CTLCOLOR_STATIC -- Static control 

Well if you want to check for the painting of a particular control then use 
pWnd->GetDlgCtrlID(), which returns the id of the control being painted.

The device of the context of the control being painted is in the pointer pDC.

This is how we go about it:

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  //call base class implementation first otherwise it may undo what we have done.
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

  //Get the ctrl id and check whether we are painting the edit control or not. 
  if (pWnd->GetDlgCtrlID() == IDC_OF_EDITBOX)
  {
    // Set the text color to red.
    pDC->SetTextColor(RGB(255, 0, 0));

    //set to trasparent mode
    pDC->SetBkMode(TRANSPARENT);

    //unless we do this there won't be any effect.
    hbr = m_brush;
  }
  return hbr;
}

Posted by Nibu babu thomas at 11:05 AM
Updated: Thursday, 10 November 2005 4:47 PM
Tuesday, 8 November 2005
How to register a Hotkey for your application?
Mood:  sharp
Topic: VC++
Now what's a Hotkey. An easy definition would be a key that remains hot throughout the lifetime of an 
application. Whenever you press the hotkey it does it's work no matter where the focus is where the 
input is directed to, etc. 

So here's how we go about it.

//Make this a member variable of your class.
UINT uniqueIdentifier;

//creates a unique identifier for your hotkey so that there is no hotkey id clashes
uniqueIdentifier = ::GlobalAddAtom("Somename");
::RegisterHotKey(
	m_hWnd/*Your window handle*/,
	uniqueIdentifier/*Unique identifier to uniquely identify this hotkey*/,
	MOD_ALT|MOD_CONTROL /*Modifier keys*/,
	VK_F10/*Virtual key code of any key*/
	);

//Add these message map entries
BEGIN_MESSAGE_MAP(..., ...)
     ON_MESSAGE(WM_HOTKEY, HotKeyHandler)
     ON_WM_DESTROY()
END_MESSAGE_MAP()

//toggle visibility
LRESULT CYourDialog::HotKeyHandler(WPARAM wParam, LPARAM lParam)
{
     static BOOL visible = IsWindowVisible();
     if(visible)
           ShowWindow(SW_HIDE);
     else
           ShowWindow(SW_SHOWNORMAL);
     visible = !visible;
}

void CYourDialog::OnDestroy()
{
     //if you register you will have to unregister too.
     UnregisterHotKey(m_hWnd, uniqueIdentifier);
}

Yeah this is how we go about it.
A cleaner approach would be create a wrapper class around this hotkey. So that registration and 
unregistration can take place smoothly.

Posted by Nibu babu thomas at 5:28 PM
Updated: Thursday, 10 November 2005 4:46 PM
How to know the state of a key?
Mood:  energetic
Topic: VC++
During a function call if you want to determine the state of a key use

::GetAsyncKeyState(VK_SHIFT)

Wait a minute there is one more:

::GetKeyState(VK_SHIFT)

This function retrieves the status of the
specified virtual key. The status specifies whether 
the key is up, down, or toggled (on, off?alternating 
each time the key is pressed)

To retrieve state information for all the virtual keys, use

::GetKeyboardState(PBYTE lpKeyState)

lpKeyState:   Pointer to the 256-byte array that receives the status data for each virtual key.

Posted by Nibu babu thomas at 3:56 PM
Updated: Thursday, 10 November 2005 4:44 PM
Loading images on the fly
Mood:  cool
Topic: VC++
Anywhere any time. Happy programming.


HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle()/*application instance handle*/,
		"C:\\Nibu.bmp"/*file name*/,
		IMAGE_BITMAP/*or IMAGE_ICON, IMAGE_CURSOR*/,
		0/*original width*/,
		0/*original height*/,
		LR_LOADFROMFILE
		);
//create bitmap object
CBitmap *bmp = CBitmap::FromHandle(hBmp);
//That's it. Very easy ;)

Posted by Nibu babu thomas at 1:43 PM
Updated: Thursday, 10 November 2005 4:44 PM

Newer | Latest | Older