c-win32编程中窗口不显示是什么问题

问题描述

win32编程中窗口不显示是什么问题

《windows程序设计》第9章ENVIRON程序
把光盘中的源代码粘贴出来发现还是没有窗口在运行,实在想不明白
(运行环境:VS2013,WINDOWS7)
以下源代码:

#include

#define ID_LIST 1
#define ID_TEXT 2

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Environ") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

 wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
 wndclass.lpfnWndProc   = WndProc ;
 wndclass.cbClsExtra    = 0 ;
 wndclass.cbWndExtra    = 0 ;
 wndclass.hInstance     = hInstance ;
 wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
 wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
 wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
 wndclass.lpszMenuName  = NULL ;
 wndclass.lpszClassName = szAppName ;

 if (!RegisterClass (&wndclass))
 {
      MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                  szAppName, MB_ICONERROR) ;
      return 0 ;
 }

 hwnd = CreateWindow (szAppName, TEXT ("Environment List Box"),
                      WS_OVERLAPPEDWINDOW,
                      CW_USEDEFAULT, CW_USEDEFAULT,
                      CW_USEDEFAULT, CW_USEDEFAULT,
                      NULL, NULL, hInstance, NULL) ;

 ShowWindow (hwnd, iCmdShow) ;
 UpdateWindow (hwnd) ;

 while (GetMessage (&msg, NULL, 0, 0))
 {
      TranslateMessage (&msg) ;
      DispatchMessage (&msg) ;
 }
 return msg.wParam ;

}

void FillListBox (HWND hwndList)
{
int iLength ;
TCHAR * pVarBlock, * pVarBeg, * pVarEnd, * pVarName ;

 pVarBlock = GetEnvironmentStrings () ;  // Get pointer to environment block

 while (*pVarBlock)
 {
      if (*pVarBlock != '=')   // Skip variable names beginning with '='
      {
           pVarBeg = pVarBlock ;              // Beginning of variable name
           while (*pVarBlock++ != '=') ;      // Scan until '='
           pVarEnd = pVarBlock - 1 ;          // Points to '=' sign
           iLength = pVarEnd - pVarBeg ;      // Length of variable name

                // Allocate memory for the variable name and terminating
                // zero. Copy the variable name and append a zero.

           pVarName = calloc (iLength + 1, sizeof (TCHAR)) ;
           CopyMemory (pVarName, pVarBeg, iLength * sizeof (TCHAR)) ;
           pVarName[iLength] = '' ;

                // Put the variable name in the list box and free memory.

           SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) pVarName) ;
           free (pVarName) ;
      }
      while (*pVarBlock++ != '') ;     // Scan until terminating zero
 }
 FreeEnvironmentStrings (pVarBlock) ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndList, hwndText ;
int iIndex, iLength, cxChar, cyChar ;
TCHAR * pVarName, * pVarValue ;

 switch (message)
 {
 case WM_CREATE :
      cxChar = LOWORD (GetDialogBaseUnits ()) ;
      cyChar = HIWORD (GetDialogBaseUnits ()) ;

           // Create listbox and static text windows.

      hwndList = CreateWindow (TEXT ("listbox"), NULL,
                          WS_CHILD | WS_VISIBLE | LBS_STANDARD,
                          cxChar, cyChar * 3,
                          cxChar * 16 + GetSystemMetrics (SM_CXVSCROLL),
                          cyChar * 5,
                          hwnd, (HMENU) ID_LIST,
                          (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),
                          NULL) ;

      hwndText = CreateWindow (TEXT ("static"), NULL,
                          WS_CHILD | WS_VISIBLE | SS_LEFT,
                          cxChar, cyChar,
                          GetSystemMetrics (SM_CXSCREEN), cyChar,
                          hwnd, (HMENU) ID_TEXT,
                          (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),
                          NULL) ;

      FillListBox (hwndList) ;
      return 0 ;

 case WM_SETFOCUS :
      SetFocus (hwndList) ;
      return 0 ;

 case WM_COMMAND :
      if (LOWORD (wParam) == ID_LIST && HIWORD (wParam) == LBN_SELCHANGE)
      {
                // Get current selection.

           iIndex  = SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;
           iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) + 1 ;
           pVarName = calloc (iLength, sizeof (TCHAR)) ;
           SendMessage (hwndList, LB_GETTEXT, iIndex, (LPARAM) pVarName) ;

                // Get environment string.

           iLength = GetEnvironmentVariable (pVarName, NULL, 0) ;
           pVarValue = calloc (iLength, sizeof (TCHAR)) ;
           GetEnvironmentVariable (pVarName, pVarValue, iLength) ;

                // Show it in window.

           SetWindowText (hwndText, pVarValue) ;
           free (pVarName) ;
           free (pVarValue) ;
      }
      return 0 ;

 case WM_DESTROY :
      PostQuitMessage (0) ;
      return 0 ;
 }
 return DefWindowProc (hwnd, message, wParam, lParam) ;

}
运行时没有显示错误

解决方案

估计窗口没有创建成功等,失败了,你可以设置断点跟踪一下,看你的代码在哪里出错了

解决方案二:

CreateWindow后,看一下是否取得hWnd。如果hWnd==INVALID_HANDLE_VALUE(或者NULL),要去做GetLastError()获取错误原因。根据LastError分析原因

解决方案三:

你的程序用了好几个资源,比如图标、光标字符串,这些资源你都附加到程序里了么?还是你只是复制粘贴了程序。

解决方案四:

转换函数calloc 的返回指针类型后编译通过,并出现界面。
编译环境:
vs2012 WINDOWS8.1

时间: 2024-09-11 03:54:57

c-win32编程中窗口不显示是什么问题的相关文章

c++-win32编程中基于对话框的程序和普通的窗口程序有什么区别?

问题描述 win32编程中基于对话框的程序和普通的窗口程序有什么区别? 很疑惑,既然窗口可以直接编写,为什么还要基于对话框来写程序? 解决方案 这就好比你将滚动条用于窗口一部分和使用滚动条控件,效果最终一样,但是后者Windows会为你处理一些鼠标和键盘上的逻辑,使得编程更容易,对话框中一般使用大量控件,Windows会为你处理比如输入焦点转移.键鼠等逻辑.

界面划窗口设计-WIN32汇编中窗口设计,新手求帮助

问题描述 WIN32汇编中窗口设计,新手求帮助 .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data? hInstance dd ? nhWnd dd ? .data SZClassName db "My Windows" SZW

C#的WIN32编程中遇到了问题,请高手指教。

问题描述 各位高手前辈,我现在正根据公司的需求,研究着WIN32编程,在研究过程中,对于文本框,下拉框,复选单选等这些基本控件的值已经获取了,但对于大型数据绑定控件(如:DATAGRID,DATAGRIDVIEW,DATAVIEW等等)就没办法获取里边的数据了,请问各位高手前辈有没有什么办法解决这个问题呢,先谢谢了. 解决方案 解决方案二:看看MSDN吧,里面有详细解释你应该看一点基本的C#编程书籍解决方案三:我说的是在另一个软件中获取数据,就是做个插件,获取另一个正在运行的软件中类似DATAG

Win32编程中请慎用ebx/esi/edi

根据我的试验,在win2000以上操作系统对于ebx,esi,edi好像是拿来就用,没有进行保护和恢复,如果你的程序中使用了这几个寄存器,请一定先压栈,用完后恢复.否则会使程序在win98下正常,在win2000下出现莫名其妙的非法操作,一般是提示某个地址不能进行读写操作,而这个地址并不在你的程序的控制下.

在J2ME编程中使用Nokia的中文模拟器

在J2ME编程中,经常需要使用Nokia系列的模拟器,但是Nokia Developer's Suit for J2ME中提供的三个模拟器都无法正确的显示中文,在程序开发过程中,大家经常要为这个事情头疼. 下面介绍几个可以在编程中支持中文显示的Nokia模拟器: 1.7210模拟器 如果大家进行是Nokia S40 1.0版本的开发的话,可以使用7210的模拟器,下载地址为:http://www.forum.nokia.com/main/0,6566,034-31,00.html 安装完成以后,

窗口风格-windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式?

问题描述 windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式? 最近在学习Windows编程,看windows程序设计,但那个hellowin程序出来的窗口是可以拉伸的,怎样固定下来,让窗口不可以拉伸,应该是一个窗口样式或者风格,但老是查不出来,求助! 解决方案 WS_SIZEBOX WS_THICKFRAM 解决方案二: http://blog.csdn.net/diaolingle/article/details/17284711 解决方案三: WS_BORDER 0X00800

win32-关于windows7中WIN32编程下的问题

问题描述 关于windows7中WIN32编程下的问题 在win7中建了一个很简单的win32工程项目,代码如下,为啥RegisterClass(&wndclass)会失败呢? #include #pragma comment(lib, "winmm") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinst

wp8-VS2015中WP8.1和WIN10通用应用Xaml的设计窗口无法显示控件!

问题描述 VS2015中WP8.1和WIN10通用应用Xaml的设计窗口无法显示控件! 已经重装2次没用求支招啊111 解决方案 看看是不是没有安装win8.1 wp8.1工具

swt-java中窗口隐藏与现显示,(子窗口回到父窗口)

问题描述 java中窗口隐藏与现显示,(子窗口回到父窗口) public static Shell shlIvmsv;//声明一个窗口管理器 创建一个窗口 J1 ...... ClientDemo.GetClientDemo().playMain();//创建另外一个窗口 J2 shlIvmsv.setVisible(false);//隐藏主界面 J1 ....... 然后我在 J2对应的程序中, ...... if(Main.shlIvmsv!=null){//显示PC主界面 Main.shl