工作中总结的编程小技巧

技巧一:int-->bool要注意的!
bool a=255;
bool b= 254;
理论上应该认为a==b,但是根据编译器的不同,结果可能完全不一样
所以更好的写法是
char ch =1; 或者0
bool a = (0 != atoi(ch));

 

 

技巧二:将std::string转int,double
先利用c_str()转成C string,再用atoi()与atof()

 

 

技巧三:const_cast操作符可以强置去除const指针的const属性

技巧四:CString读取文本的每一行
CStdioFile LogIDFile;
char* pFileName = "Log.txt ";
CString strtemp;
if( LogIDFile.Open( pFileName, CFile::modeRead ))
{
LogIDFile.SeekToBegin();
LogIDFile.ReadString(strtemp);
}
LogIDFile.Close();

 

 

技巧五:win32下给任何一个句柄添加消息处理函数:
为了简单假如在About对话框里贴了一个 IDC_STATIC_1。在IDC_STATIC_1上挂了一个 IDB_BITMAP1。
IDC_STATIC_1 控件属性,“通知”=Notify设为TRUE。
有了上面的假设后,就可以用下面的程序控制picture的全部行为。

LONG OldPicProc;
LRESULT CALLBACK PicProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
        case WM_RBUTTONDOWN:
            {
                WORD xPos = LOWORD(lParam);
                WORD yPos = HIWORD(lParam);
            }
            break;
    }
  return CallWindowProc((WNDPROC)OldPicProc, hWnd, message, wParam, lParam);
}


LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
        case WM_INITDIALOG:
            {
              HWND hWnd = GetDlgItem(hDlg, IDC_STATIC_1);
                OldPicProc = SetWindowLong(hWnd, GWL_WNDPROC, (LONG)PicProc);
            }
       
            return TRUE;

        case WM_COMMAND:
            if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL )
            {
                EndDialog(hDlg, LOWORD(wParam));
                return TRUE;
            }
            break;
    }
    return FALSE;
}

 

 

技巧六:屏幕坐标转三维坐标(反变换的过程)
void GetOGLPos(int x, int y, double * posX, double * posY, double * posZ)
{
GLint viewport[4];
GLdouble projection[16];
GLfloat winX, winY, winZ;

glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

gluUnProject( winX, winY, winZ, modelview, projection, viewport, posX, posY, posZ);
}

 

 

技巧七 宽字符字符串转多字节字符串
//===方法1
TCHAR tcScriptName[MAX_PATH];
tcScriptName = "filename";
size_t i;
  char tmp[MAX_PATH];
  mbstate_t       mbstate;

  // Reset to initial shift state
  ::memset((void*)&mbstate, 0, sizeof(mbstate));

  const wchar_t* wt = tcScriptName;
  wcsrtombs_s(&i, tmp, MAX_PATH, &wt, MAX_PATH,&mbstate);
//===方法2
char * input = null;
wchar_t wc_input[MAX_USERNAME_LEN] = L"test";

  int nLen = WideCharToMultiByte( CP_ACP, 0, wc_input, -1, NULL, 0, NULL, NULL );
  int i = wcslen(wc_input)*sizeof(wchar_t);
  input = (char*)realloc(input,i+1);
  if (!input)
  {
   free(input);
   input = (char*)malloc(i + 1);
  }
  WideCharToMultiByte( CP_ACP, 0, wc_input, -1, input, nLen, NULL, NULL );

 

//===方法3

采用USER_CONVERTION宏。A2T与T2A两个宏在USER_CONVERTION作用域范围内可以起到方便转换的作用。

 

 

技巧八 获得界面上所有控件
CWnd *pWnd = this->GetWindow( GW_CHILD );
while( pWnd )
{
  if( pWnd->IsKindOf( RUNTIME_CLASS(CEdit) ) )
      pWnd->ShowWindow(SW_SHOW);
       pWnd = pWnd->GetWindow( GW_HWNDNEXT );
}

 

 

技巧九 判断基类指针指向的派生类类型

方法一:
class A
{
public:
    virtual int get_type_id()
    {
        return 0;   
    }
};

class B: public A
{
public:
    int get_type_id()
    {
        return 1;
    }
};

方法二:
用RTTI
class A
{
public:
    virtual ~A(){} //必须

};

class B: public A
{
};

int main()
{
    A * p = new B;
        bool p_is_B = (typeid(B) == typeid(*p));
    std::cout<<p_is_B<<std::endl;

        p_is_B = (dynamic_cast<B*>(p) != 0);
    std::cout<<p_is_B<<std::endl;
}

 

 

技巧十 窗口ID,句柄,指针三者相互转换函数
ID--HANDLE--HWND三者之间的互相转换
===============
id->句柄
hWnd = ::GetDlgItem(hParentWnd,id);
===============
id->指针
CWnd::GetDlgItem();
===============
句柄->id
id = GetWindowLong(hWnd,GWL_ID);
===============
句柄->指针
CWnd *pWnd=CWnd::FromHandle(hWnd);
===============
指针->ID
id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
=================
指针->句柄
hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;

 

 

 

技巧十一   Debug调试正常,release下出错的原因

debug下正常,release下不正常的原因大多在于变量未初始化及其引起的在调试模式下数组下标越界不报错的问题。这种情况在release下将可能产生随机性BUG,并且由于在release状态下不易调试。可以在数值异常处设置调试输出到文件或调试窗口(可采用ouputdebugstring()函数),并向程序流程上游查询出错的源头。故应养成定期编译release版本的习惯。
下面的程序在debug中运行的很好。  
         thing   *   search(thing   *   something)  
                  BOOL   found;  
                  for(int   i   =   0;   i   <   whatever.GetSize();   i++)  
                      {  
                      if(whatever[i]->field   ==   something->field)  
                            {   /*   found   it   */  
                              found   =   TRUE;  
                              break;  
                            }   /*   found   it   */  
                        }  
          if(found)  
                            return   whatever[i];  
          else  
                            return   NULL;  
  而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。

技巧十二  在多文档中绘制OpenGL图形的主要步骤:
(1)、由于在多文档中有多个窗口需要绘制,而当前的OpenGL渲染描述表只有一个,因此,在窗口的图形绘制完之后,必须将OpenGL绘制描述表释放,以备其他窗口使用。
(2)、必须新建一个视图类,在该视图类中对Windows设备描述表和OpengL的渲染描述表进行管理,而应用程序中的其他各视图均从该类中派生。
(3)、在该新建的视图类中定义一个OpenGL绘图的虚函数,在其派生的类中可以对其进行重载,可以在应用程序中的视图类直接调用OpenGL命令绘图。
(4)、必须取消派生的视图类的WM_DRAW消息处理函数和PreCretaeWindow函数。

技巧十三 MFC多文档实现标签页切换各个视图的方法(提供思路,细节不阐述)

1、首先创建一个child类型的对话框,在其上放置TAB control

2、在视图类的初始化事件中将视图指针与TAB control上的标签绑定

3、设计TAB control的OnSelchange消息响应,用MDIActivate函数控制激活选中的标签绑定的视图

参见以下例子:http://www.vckbase.com/document/viewdoc/?id=838

技巧十三 OPENGL出现Z-Fighting的解决方法

1、绘制其中一个物体时禁用深度测试(若出现深度覆盖错误的情况可以调整绘制顺序)

2、采用glPolygonOffset函数将其中一个物体的位置做轻微位移

(不断添加ing)

  • 0
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
### 回答1: 编程思想C是一本经典的编程书籍,它以C语言为工具,介绍了一些重要的编程思想和方法。这本书对于想要深入学习C语言并拥有良好的编程思维的人来说,是一本非常有价值的读物。 编程思想C强调了编程的系统性思维,即将程序看作一个整体系统,而不仅仅是一堆代码的集合。它鼓励程序员学会分析问题、抽象问题和设计解决方案。通过学习本书的思想,读者可以掌握如何将复杂的问题分解为更小的子问题,并逐步实现这些子问题来解决整个问题。这种系统性的思维能力对于解决实际问题非常重要。 此外,编程思想C还介绍了一些优秀的编程技巧和实践方法,如模块化编程、面向对象编程以及调试技巧等。这些技巧和方法对于提高代码的可读性、可维护性和可扩展性都起到了积极的作用。 总之,编程思想C是一本非常值得一读的编程书籍,它从系统性思维的角度出发,帮助读者培养良好的编程思维和方法。通过学习本书,读者可以更好地理解问题、设计解决方案,并写出高质量的代码。无论是初学者还是有一定编程经验的人,都可以从受益匪浅。 ### 回答2: 编程思想C是一本介绍C编程语言的经典教材,该书以其精简、实用的特点而受到广大程序员的喜爱。 首先,编程思想C讲解了C语言的基本语法和概念,比如变量、数据类型、运算符、控制语句等。同时,它还深入探讨了C语言内存管理的原理,包括栈、堆、指针等内容,帮助读者理解C语言底层的运行机制。 其次,编程思想C注重实践,通过大量的示例代码和练习题,引导读者进行实际的编程练习。这样的设计不仅能够帮助读者更好地理解概念和语法,而且能够提高他们的编程能力和实际操作经验。 此外,编程思想C还讲解了一些高级特性和技巧,如函数指针、位操作、内联汇编等。这些特性能够帮助程序员优化代码、提高程序性能,并且开阔了读者的思维和编程视野。 最后,编程思想C还提供了一些常见的编程错误和解决方法,帮助读者避免常见的陷阱和错误,同时也提供了一些调试和优化的技巧。 总的来说,编程思想C以其简洁明了的风格、丰富的知识内容和实践导向的设计,帮助读者系统地学习和掌握C编程语言。无论是初学者还是有一定编程基础的程序员,都能从受益匪浅。无论是想要学习C语言的基础知识,还是提高C编程技巧编程思想C都是一本值得推荐的书籍。 ### 回答3: 编程思想C是一本经典的编程教材,主要介绍了C语言的基本概念和编程思想。它的内容丰富全面,适合初学者入门以及有一定基础的程序员进一步提升。下面我将以300字回答编程思想C这本书的内容和特点。 首先,编程思想C详细介绍了C语言的基本语法和数据结构。它从变量、运算符、流程控制语句开始讲解,帮助读者建立起对C语言的基本理解。然后,它深入介绍了数组、指针和结构体等数据结构,让读者了解这些在C语言非常重要的数据类型的使用方法和特点。 其次,编程思想C重点强调了C语言编程思想和技巧。它通过一系列编程示例和案例剖析,教会读者如何合理利用C语言的特性进行程序设计。例如,它介绍了模块化编程的概念和方法,让程序员能够将复杂的问题分解成简单的模块,提高代码的可读性和可维护性。此外,在讲解算法和数据结构时,它也会给出一些常用的编程技巧和优化方法,帮助读者提高程序的效率和性能。 最后,编程思想C还提供了大量的习题和练习,供读者巩固所学的知识。这些习题有不同的难度和类型,既有简单的选择题和填空题,也有需要编写程序解决实际问题的应用题。通过解决这些练习,读者能够更好地理解书的知识点,并且提升自己的编程能力。 总结来说,编程思想C是一本非常实用和全面的C语言教材。它系统地介绍了C语言的基本概念和编程技巧,帮助读者建立起扎实的编程基础。如果你想学习C语言或者提升自己的C编程能力,编程思想C是一个非常好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值