How to copy or move file with progress?

28 08 2008

In old Win98 days, File copying progress notification was horrific. Even if you have a lot of data to copy, it always says – you have 5 more minutes to finish. πŸ˜€ Well, how to copy or move file with accurate progress?

You can use the api – CopyFileEx() for copying data with progress and MoveFileEx() to move files with progress. Both are more or less similar in usage. In both cases, just call the apis by providing the callback function pointer. System will give callback notification for the progress. See the code snippet of CopyFileEx().

// Callback function for handling progress notification.
DWORD CALLBACK CopyProgressRoutine(
                          LARGE_INTEGER TotalFileSize,
                          LARGE_INTEGER TotalBytesTransferred,
                          LARGE_INTEGER StreamSize,
                          LARGE_INTEGER StreamBytesTransferred,
                          DWORD dwStreamNumber,
                          DWORD dwCallbackReason,
                          HANDLE hSourceFile,
                          HANDLE hDestinationFile,
                          LPVOID lpData )
    // Calculate the percentage here.
    double Percentage = ( double(TotalBytesTransferred.QuadPart) /
        double(TotalFileSize.QuadPart) ) * 100;

    // Continue the file copy. It can also be stopped.

void CDlgDlg::OnCopy()
    // Copy the file.
    CopyFileEx( _T("c:\\Jijo\\Games.rar"),
                0 );

CopyFIleEx() and MoveFileEx() are available only from Windows NT onwards. So don’t forget to add _WIN32_WINNT=0x0400 to project settings.

Targeted Audience – Beginners.

how to set color for static control text in dialog?

27 08 2008

Colors convey meanings too. For instance, if something is written in red – that means something to be cautious. If its in green, its treated as safe. Well, usually in window dialogs, the static control texts are black in color. Is it possible to color them to convey more meaning?

Yes! You have to handle WM_CTLCOLOR message. For each control, this message will be triggered and you’re free to do modification on your control. Have a look at the code snippet in MFC framework.

// Message Map

HBRUSH CDlgDlg::OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor )
    // Call base class version at first. Or else it will override your changes.
    HBRUSH hbr = CDialog::OnCtlColor( pDC, pWnd, nCtlColor );

    // Check whether which static label its.
    if( pWnd->GetDlgCtrlID() == IDC_STATIC_OK )
        // Set color as red.
        pDC->SetTextColor( RGB( 255, 0, 0 ));
        pDC->SetBkMode( TRANSPARENT );

    return hbr;

Always call CDialog::OnCtlColor() at first. Or else it will override your modifications.

Targeted Audience – Intermediate.

How to check whether the window handle is valid?

24 08 2008

Since communication by messages are so easy, windows used to communicate with each other by using messages. For instance, if simple data blocks are to be transfered – WM_COPYDATA can be used. For all those instances the window should be alive. But how to know whether the current window handle is valid or whether it points to a dead window?

You can call the api – IsWindow() by passing window handle. If the handle points to a live window, then the function returns true else false. Have a look at the code snippet.

// The handle to be tested.
HWND hWindow = GetSafeHwnd();

// Check whether the window is still there.
BOOL bWindowAlive = IsWindow( hWindow );

While digging for the api, i found an interesting info. What about window handle re-cycling? For instance you have a window handle and you’re going to check that window by calling IsWindow() function. But in between that the real window is closed and a new window is created. Whether the window handler will be allocated to the new window?

Well, the answer is here. Have a look at it. Its interesting. The oldnewthing. πŸ˜‰

Targeted Audience – Beginners.

Microsoft Visual Studio 2008 Service Pack 1 Released!

21 08 2008

Visual Studio 2008 Service Pack 1 is released!
Download it from here.

Main features included in this service pack are –

Visual Studio 2008 SP1 features:

  • Improved WPF designers
  • SQL Server 2008 support
  • ADO.NET Entity Designer
  • Visual Basic and Visual C++ components and tools (including an MFC-based Office 2007 style β€˜Ribbon’)
  • Visual Studio Team System Team Foundation Server (TFS) addresses customer feedback on version control usability and performance, email integration with work item tracking and full support for hosting on SQL Server 2008
  • Richer JavaScript support, enhanced AJAX and data tools, and Web site deployment improvements

The .NET Framework 3.5 SP1 delivers:

  • Performance increases between 20-45% for WPF-based applications – without having to change any code
  • WCF improvements that give developers more control over the way they access data and services
  • Streamlined installation experience for client applications
  • Improvements in the area of data platform, such as the ADO.NET Entity Framework, ADO.NET Data Services and support for SQL Server 2008’s new features

Enjoy the new Service Pack!!!

How to disable maximizing the dialog from Task manager?

20 08 2008

Its not mandatory for every windows citizen to have maximize button. πŸ˜€ For instance, Windows calculator. But do you know that via taskmgr we could maximize any dialogs? Even you can maximize the dialog which doesn’t have maximize style. Its a master piece of QA team to make the dialog look weired. Well how to prevent it?

You can do it by handling – WM_GETMINMAXINFO message. Before resizing, this message is fired to the dialog to get the minimum and maximum window dimensions. Since, we don’t need to change our dimensions, we have to set the max dimensions as current window dimension. Have a look at the code snippet.

// Message map

void CRabbitDlg::OnGetMinMaxInfo( MINMAXINFO FAR* pMinMaxInfo )
    // Window rect.
    RECT rect = { 0 };
    GetWindowRect( &rect );
    CRect WindowRect( &rect );

    // Set the maximum size. Used while maximizing.
    pMinMaxInfo->ptMaxSize.x = WindowRect.Width();
    pMinMaxInfo->ptMaxSize.y = WindowRect.Height();

    // Set the x,y position after maximized.
    pMinMaxInfo->ptMaxPosition.x = rect.left;
    pMinMaxInfo->ptMaxPosition.y =;

There is one small known issue – if we maximize via taskmgr, the window remains same, but the title bar will be painted like maximized.

Targeted Audience – Intermediate.

How to hide file programmatically?

18 08 2008

Hidden files are very basic and primitive mode of protection. If your file is set as hidden, it won’t get listed to normal user, unless he explicitly enabled – “Show hidden files”. Well, how to make a file really hidden?

You can use the api – SetFileAttributes(). Pass FILE_ATTRIBUTE_HIDDEN as attribute and you’re file will be hidden. Have a look at the code snippet.

// The file, which is to be hidden.
CString csFile = _T("C:\\Autumn Leaves.jpg");

// Hide the file.
SetFileAttributes( csFile, FILE_ATTRIBUTE_HIDDEN );

Another alternative is to use CFile::SetStatus(). Have a look at it too…

Targeted Audience – Beginners.

How to handle F1 or help in application?

17 08 2008

Help is inevitable part of every windows application. The first function key – F1 itself is assigned as help in every application. Well, how to handle the user’s “Mayday” call in application?

Basically you’ve to handle the WM_HELP message. When you press F1 the WM_HELP message will be posted to your window. To handle this via MFC, Add ON_WM_HELPINFO() to message map and implement OnHelpInfo() in your dialog. Have a look at the following code snippet.

// Add ON_WM_HELPINFO() to your message map.

// Add this function to your dialog.
BOOL CYourDialog::OnHelpInfo( HELPINFO* HelpInfo)
   // Handle your help request here.
   return TRUE;

Well, the only help i used to use is MSDN. If I accidentally launch Windows help, I’ll kill it immediately by using taskmgr. I don’t know why I hate it. πŸ™‚

Targeted Audience – Beginners.

How to set timer in mfc dialog?

12 08 2008

Timers are running everywhere! The moment when your machine starts, when your machine is turned off, in your heart, in your lungs, in your brain and even in your mind, its everywhere. Well, Software application are not exception to timers. We have to use timers in several situations.

But how to create timers and use it?

For creating timers you can use the api – SetTimer(). In SetTimer() you’ve to specify the time interval in milliseconds, a timer id as UINT, then TimerProc. For each tick of specified timer, windows will call the TimerProc. If you didn’t specify any TimerProc, then a WM_TIMER message will be posted to your window.

You can utilize the Timer ID to set multiple timers using the same TimeProc. You can use KillTimer() to remove the timer. Have a look at the code snippet. In the given code snippet, timer is handled by WM_TIMER message.

// Message Map


// Timer ID constants.
const UINT ID_TIMER_MINUTE  = 0x1001;
const UINT ID_TIMER_SECONDS = 0x1000;

// Start the timers.
void CDlgDlg::StartTimer()
    // Set timer for Minutes.
    SetTimer( ID_TIMER_MINUTE, 60 * 1000, 0 );

    // Set timer for Seconds.
    SetTimer( ID_TIMER_SECONDS, 1000, 0 );

// Stop the timers.
void CDlgDlg::StopTimer()
    // Stop both timers.
    KillTimer( ID_TIMER_MINUTE  );
    KillTimer( ID_TIMER_SECONDS );

// Timer Handler.
void CDlgDlg::OnTimer( UINT nIDEvent )
    // Per minute timer ticked.
    if( nIDEvent == ID_TIMER_MINUTE )
        // Do your minute based tasks here.

    // Per minute timer ticked.
    if( nIDEvent == ID_TIMER_SECONDS )
        // Do your seconds based tasks here.

β€œToday is the tomorrow you worried about yesterday” – So enjoy your day!

Targeted Audience – Beginners.

How to sort an array by using STL?

10 08 2008

Today I’ll tell a story… Its interesting!

Once upon a time, there lived a C++ Padawan. One day, he want to sort an array. He knows that STL have std::sort() function. But he want to sort an array, not an STL container. What a fool he is? Native array’s don’t have iterators. So how could he call the std::sort() function? Well, he is clever – he created a vector, copied his array to vector, then he called the sort() function. After sorting, he copied the data back to array.

The End!

But now he is ashamed of what he did. Because now he realize that he can use std::sort() directly on native array too! But how?

You can use array pointers direclty in STL algorithms. They act like iterators itself. Have a look at the code snippet.

// Integer array with 10 items.
int Array[10] = { 9,3,2,4,0,6,7,8,1,5 };

// Sort them.
std::sort( Array, Array + 10 );

Well, Can you guess – who was that C++ trainee? It was me. πŸ˜‰

Targeted Audience – Beginners.