小弟初学mfc,到处碰壁。
尤其是函数的调用,以及各模块的责任,搞得我混乱。很想知道mfc为我们做了什么,就在那里瞎调试。
为了找到一个函数的说明,得在msdn上找半天。(还全是英文:))
新装了net版,感觉用起来好多了。下面是我的三个问题:1、
我本来是用向导创建一个edit控件。设置了它的风格。
现在想用create函数来创建,但是无论怎么设置ws风格,
几乎把所有的ws都用上了,就是不能和原来的一样。
我想知道如何能找到mfc向导为我们设置的风格参数。2、
窗口函数是由user模块调用的,那么他如何根据相应的消息来
让用户进程调用消息处理函数。
(不是由user模块来调用吧?)。
能否通过调试等方法找到答案。3、
消息循环和界面其他的处理开在一个线程里是否合适。
有两个问题:
(1)如果主界面线程阻塞,并且其他的线程是工作者线程,就死锁了。
(2)消息循环和其他处理之间如何合理的分配cpu时间。
如果再加几个定时的时钟,到底执行到谁了,岂不是很混乱。
有没有一种方法来跟踪到底执行到谁了。
有没有一种方法来保证一定的执行顺序。
初学mfc,所以有很多机制没有弄清楚。
可能问得也有点问题。请大家指出来。
谢谢各位。

解决方案 »

  1.   

    看msdn,是最快的,要不自己跟踪mfc的源代码
      

  2.   

    我想第一个问题当然是最简单的问题,其实也不需要跟踪原代码,你用spy++查看一下窗口的风格就都可以实现了。后面的问题还是让mfc的高手来讨论吧
      

  3.   

    1. 用spy看看
    2. 看深入浅出
    3. 不知道,多线程看windows高级编程或win32多线程程序设计
      

  4.   

    1. 用spy看看
    2. 看深入浅出
    3. 不知道,多线程看windows高级编程或win32多线程程序设计
      

  5.   

    msdn虽然都是英文,不过比跟踪还是要爽一点。我晕跟踪。zhouyong0371(小周周),haha什么呀?呵呵。To lygfqy(风清扬):恩,我spy看看。
      

  6.   

    《Visual C++程序设计导学》(清华大学出版社)这本书对mfc讲的很透,推荐楼主看看
      

  7.   

    《Visual C++程序设计导学》(清华大学出版社)这本书对mfc讲的很透,推荐楼主看一看
      

  8.   

    To bcpl(戒烟直到五颗星):
     
       第2个问题就是看深入浅出,看着看着突然混乱掉了。现在头晕。呵呵。 
       等我清醒一会儿再看看。
      

  9.   

    第二个问题的理解应该是这样,系统本身有自己的系统消息的队列,而消息中是含有窗口的句柄以及优先的级别,而系统通过队列来分发消息,窗口处理函数就是当窗口接到系统发过来消息的时候的调用
    第三个问题应该是每个进程生成是都会自动的生成一个主线程用来处理事物,当主线程不一定能很好的控制程序的流向时,可以生成副线程来辅助(以免影响用户和计算机的交互)分配cpu的时间是由系统来完成,一般的情况下不需要太多的考虑,当线程间有交互时程序容易发生锁死的情况,才应当考虑先后的问题(情况比较复杂,应小心在程序中处理)
      

  10.   

    To gzshd(郁闷):
       
       手头没有这本书。我找找看。
       清华的书,要出血啊。呵呵。
       
       大家不要说得那么简洁啊,说一两句看法或者解释先。谢谢。
      

  11.   

    第2个问题,我这样理解对不对?应用窗口接受消息,把消息发到应用的消息队列。
    user模块把消息发到应用的消息循环去(通过getmessage)
    消息循环把消息分派到窗口函数。(通过dispatchmessage)问题是窗口函数是由user模块调用的。
    但是有一些消息的处理函数是由我们来写的,这些函数是不是由用户进程来执行的呢?
    如果不是,user模块怎么调用用户进程中的消息处理函数?
    如果是,user模块怎么能让用户进程去调用消息处理函数?哎,头晕。
      

  12.   

    以鼠标点击为例,当鼠标在窗口点下时,系统得到鼠标硬件发出的消息后,把判断处理消息并放到系统消息队列中,消息本身有窗口的句柄,然后发到窗口,窗口生成有消息处理函数,进行处理。这里有一个进程空间的问题,就是user32.dll模块被进程加载在自己的进程空间之中,调用的问题相信都理解了。
    比如普通sdk窗口程序中大部分都有
    while(GetMessage())
    {
    TranslateMessage();
    DispatchMessage();
    }
    专门处理消息的过程
      

  13.   

    VC98\MFC\SRC
    里有许多诱人的东西
      

  14.   

    没有仔细研究过底层的消息机制,不过大概是这样吧:
    窗口函数并不是由user模块调用,它只是负责把硬件消息放到系统消息队列中。
    系统消息队列中的消息和post到应用程序消息队列的消息由消息循环处理,在处理中
    DispatchMessage调用对应的窗口函数。如果是SendMessage的话调用方程序将直接调用
    窗口函数。
      

  15.   

    To lygfqy(风清扬):
       
       “user32.dll模块被进程加载在自己的进程空间之中”。
        原来如此!我本来以为user模块是一个独立的线程来着。:)
        谢谢你,现在头脑不晕了。
        
         
      

  16.   

    To bcpl(戒烟直到五颗星):    应该是user模块负责把硬件消息放到系统消息队列中吧。
        比如鼠标点击,产生一个中断,是user模块把中断封装成消息。
      
        窗口函数是call back的,是user模块调用它吧。
        好象是dispatchmessage先调用user模块,再user模块调用wndproc。    听你一说,我又要晕。
        :)。
      

  17.   

    >>应该是user模块负责把硬件消息放到系统消息队列中吧。
        >>比如鼠标点击,产生一个中断,是user模块把中断封装成消息。
    我的意思也是这样
        >>窗口函数是call back的,是user模块调用它吧。
        >>好象是dispatchmessage先调用user模块,再user模块调用wndproc。
    DispatchMessage是user32.dll的导出函数,所以是dispatchmessage借助这个
    函数来调用正确的窗口过程
      

  18.   

    >>应该是user模块负责把硬件消息放到系统消息队列中吧。
        >>比如鼠标点击,产生一个中断,是user模块把中断封装成消息。
    我的意思也是这样
        >>窗口函数是call back的,是user模块调用它吧。
        >>好象是dispatchmessage先调用user模块,再user模块调用wndproc。
    DispatchMessage是user32.dll的导出函数,只是借助dispatchmessage这个
    函数来调用正确的窗口过程,它与MessageBox或其它api函数本质上没两样,
    所以真正处理消息队列消息及调用窗口函数还是靠应用程序自己,如果不dispatch消息,
    即使有消息也不会导致窗口过程被调用。
      

  19.   

    第2个问题听lygfqy和bcpl一说,大致上明白了。
    bcpl说的“DispatchMessage是user32.dll的导出函数”
    这个不大懂,我再去查查资料。这样看来,第3个问题是不是问得多余了?
    反正就一个消息一个消息处理贝,呵呵。vc版有点热闹了。这样才好哇。