Click here to Skip to main content
15,867,141 members
Articles / Desktop Programming / MFC

Getting BN_DOUBLECLICK to Work for Buttons

Rate me:
Please Sign up or sign in to vote.
4.18/5 (5 votes)
25 Jun 2002CPOL 85.9K   38   4
BN_DOUBLECLICKED doesn't get received

Introduction

In MFC, it is quite possible to map a BN_DOUBLECLICKED message for your button, but it will never be called by the framework as the two clicks get interpreted as two single clicks on the button. To get around this in the past, I developed the following algorithm in the BN_CLICKED handler to work out which type of clicking was really being done by the user.

C++
void CTestView::OnButton1()
{
    // must be static due to re-entrant function
    static bool double_wait = false;
    
    // must be static due to re-entrant function
    static bool handled = false ;
    
    MSG    msg ;
    if (double_wait)
        {
        // this is a double click
        // do double click code here
        TRACE("Double click\n") ;
        handled = true ;
        return ;
        }
    else
        handled = false ;
        double_wait = true ;

    UINT    time = GetDoubleClickTime() ;
    UINT    slice = time / 10 ;
    
    // break up the OS double click time into some small
    // chunks to avoid hogging the CPU this could be done
    // in many different ways, but I chose this one
    for (int i = 0 ; i < 10 && !handled ; i++)
    {
        // break up the sleep into chuncks to give better response
        if (i == 9)
            Sleep(slice + time % 10) ;
        else
        {
            // dispatch any messages that have come in,
            // including any clicks on this button again.
            Sleep(slice) ;
        }
        while (::PeekMessage(&msg, NULL, 0, 0,
                                PM_NOYIELD | PM_REMOVE))
        {
            ::TranslateMessage(&msg) ;
            ::DispatchMessage(&msg) ;
        }
    }
    // time ran out,
    if (!handled)
    {
        // this is a single click
        // do single click code here
        TRACE("Single click\n") ;
    }
    double_wait = false ;
}

So with this code in your OnClick() handler, you can then do the correct single/double click function code.

Enjoy!

Revision History

  • 26th June, 2002 - Initial revision

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Sirius Analytical Instruments
United Kingdom United Kingdom
A research and development programmer working for a pharmaceutical instrument company for the past 17 years.

I am one of those lucky people who enjoys his work and spends more time than he should either doing work or reseaching new stuff. I can also be found on playing DDO on the Cannith server (Send a tell to "Maetrim" who is my current main)

I am also a keep fit fanatic, doing cross country running and am seriously into [url]http://www.ryushinkan.co.uk/[/url] Karate at this time of my life, training from 4-6 times a week and recently achieved my 1st Dan after 6 years.

Comments and Discussions

 
GeneralHere is my way to do it. Pin
LeeeNN3-Dec-05 15:34
LeeeNN3-Dec-05 15:34 
GeneralBN_DOUBLECLICK Pin
LeeeNN3-Dec-05 6:23
LeeeNN3-Dec-05 6:23 
GeneralAnother way to do it Pin
rasorl30-Sep-03 21:50
rasorl30-Sep-03 21:50 
QuestionRe: Another way to do it Pin
bruce2g8-Dec-05 7:37
bruce2g8-Dec-05 7:37 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.